Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вложенный запрос на выборку. Ошибка / 7 сообщений из 7, страница 1 из 1
26.03.2007, 01:20
    #34414410
Skif Swarogich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос на выборку. Ошибка
Сабж.
Помгите организовать выборку из трех таблиц. Данные везде есть. Что нужно сделать: свести урезанный запрос основной таблицы(temp_table), конвертировав попутно данные находящиеся в temp.interface и temp.host из varchar в integer (необходимые значения находятся в interface_table и host_table)
Собственно запрос и ошибка вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
	temp.ip_from, temp.ip_to, temp.bytes, temp.date_ins, temp.time_ins, iface.id AS interface, host.id AS hostname
FROM 
	temp_table temp , host_table host, interface_table iface 
WHERE 
	temp.traff='ua' and iface.id=(
		SELECT iface.id FROM temp_table temp , host_table host, interface_table iface WHERE iface.interface=temp.interface and iface.hostname=(
			SELECT host.id FROM temp_table temp , host_table host, interface_table iface WHERE host.hostname=temp.host
		)

	)
ERROR: more than one row returned by a subquery used as an expression


Пока кручусь, но ничего путного не выходит :(
Структура таблиц:
[temp_table]
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  attname  |      format_type       | attnotnull | atthasdef | attnum
-----------+------------------------+------------+-----------+--------
 ip_from   | inet                   | f          | f         |      1
 s_port    | integer                | f          | f         |      2
 ip_to     | inet                   | f          | f         |      3
 d_port    | integer                | f          | f         |      4
 proto     | smallint               | f          | f         |      5
 packets   | integer                | f          | f         |      6
 bytes     | integer                | f          | f         |      7
 date_ins  | date                   | f          | f         |      8
 time_ins  | time without time zone | f          | f         |      9
 host      | character varying(32)  | f          | f         |     10
 interface | character varying(6)   | f          | f         |     11
 traff     | character varying(6)   | f          | f         |     12
[host_table]
Код: plaintext
1.
2.
3.
4.
 attname  |      format_type      | attnotnull | atthasdef | attnum
----------+-----------------------+------------+-----------+--------
 id       | integer               | t          | t         |      1
 hostname | character varying(64) | f          | f         |      2
[interface_table]
Код: plaintext
1.
2.
3.
4.
5.
  attname  |     format_type      | attnotnull | atthasdef | attnum
-----------+----------------------+------------+-----------+--------
 id        | integer              | t          | t         |      1
 hostname  | integer              | t          | f         |      2
 interface | character varying(8) | t          | f         |      3
...
Рейтинг: 0 / 0
26.03.2007, 04:56
    #34414460
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос на выборку. Ошибка
Skif Swarogich
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT temp.ip_from, temp.ip_to, temp.bytes, temp.date_ins, 
       temp.time_ins, iface.id AS interface, host.id AS hostname
  FROM temp_table temp , host_table host, interface_table iface 
 WHERE temp.traff='ua' 
 and iface.id=(
                SELECT iface.id 
                  FROM temp_table temp , host_table host, interface_table iface 
                 WHERE iface.interface = temp.interface 
                   and iface.hostname = (
                                          SELECT host.id 
                                            FROM temp_table temp , host_table host, interface_table iface 
                                           WHERE host.hostname=temp.host
                                        )
              )
ERROR: more than one row returned by a subquery used as an expression

Ну, ошибка говорит сама за себя - подзапрос в такой нотации (знак "равно" перед подзапросом) должен возвращать не более одной строки. А у тебя он возвращает несколько строк.
Соответственно запрос можно заставить работать, если знак равенства перед подзапросами заменить на IN.
Кроме того, посмотри внимательно на то, что я выделил в твоем коде. У тебя в этом подзапросе участвует три таблицы, а связь ты указал только для двух из них. Соответственно с третьей таблицей у тебя будет декартово произведение. Не уверен, что по логике твоего зарпоса тебе этот декарт нужен.
...
Рейтинг: 0 / 0
26.03.2007, 04:58
    #34414461
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос на выборку. Ошибка
Кстати, на более высоком уровне у тебя таже ошибка - таблиц указано три, а связи прописаны только для двух.
Так что пересмотри логику запроса.
...
Рейтинг: 0 / 0
26.03.2007, 04:59
    #34414462
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос на выборку. Ошибка
А вообще, лучше приведи тестовый набор данных, словесное описание логики построения итоговой выборки и желаемый результат на приведенных тестовых данных.
Ибо по твоему запросу вообще не понятно, что именно ты пытаешься сделать...
...
Рейтинг: 0 / 0
26.03.2007, 12:33
    #34415204
Skif Swarogich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос на выборку. Ошибка
Данные ниже:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
skif=> select * from temp_table where traff='ua' limit 5;
LOG:  duration: 428.949 ms  statement: select * from temp_table where traff='ua' limit 5;
     ip_from     | s_port |     ip_to      | d_port | proto | packets |   bytes   |  date_ins  | time_ins |    host    | interface | traff
-----------------+--------+----------------+--------+-------+---------+-----------+------------+----------+------------+-----------+-------
 194.143.145.34  |      0 | 77.122.249.242 |      0 |    47 |  352997 | 201144760 | 2007-02-09 | 10:14:50 | fbsd2.home | rl0       | ua
 212.42.64.7     |     53 | 77.122.249.242 |  58354 |    17 |      10 |      1367 | 2007-02-09 | 10:20:06 | fbsd2.home | rl0       | ua
 212.42.64.9     |     53 | 77.122.249.242 |  58354 |    17 |       7 |       566 | 2007-02-09 | 10:20:06 | fbsd2.home | rl0       | ua
 213.186.114.205 |     53 | 77.122.249.242 |  58354 |    17 |       1 |       131 | 2007-02-09 | 10:44:48 | fbsd2.home | rl0       | ua
 213.186.116.43  |     53 | 77.122.249.242 |  58354 |    17 |       3 |       510 | 2007-02-09 | 15:32:16 | fbsd2.home | rl0       | ua
(записей: 5)

skif=> select * from host_table;
LOG:  duration: 124.343 ms  statement: select * from host_table;
 id |  hostname
----+------------
  1 | fbsd.home
  2 | fbsd2.home
(записей: 2)

skif=> select * from interface_table;
LOG:  duration: 3.026 ms  statement: select * from interface_table;
 id | hostname | interface
----+----------+-----------
  1 |        2 | rl0
(1 запись)

skif=>                  

За комментарий спасибо, попробую.
...
Рейтинг: 0 / 0
26.03.2007, 12:41
    #34415231
Skif Swarogich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос на выборку. Ошибка
Запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT 
	temp.ip_from, temp.ip_to, temp.bytes, temp.date_ins, temp.time_ins, iface.id AS interface, host.id AS hostname
FROM 
	temp_table temp , host_table host, interface_table iface 
WHERE 
	temp.traff='ua' and iface.id IN (
		SELECT iface.id FROM temp_table temp , host_table host, interface_table iface WHERE iface.interface=temp.interface and iface.hostname IN (
			SELECT host.id FROM temp_table temp , host_table host, interface_table iface WHERE host.hostname=temp.host
		)

	);
Вывод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
     ip_from     |      ip_to      |   bytes   |  date_ins  | time_ins | interface | hostname
-----------------+-----------------+-----------+------------+----------+-----------+----------
 194.143.145.34  | 77.122.249.242  | 201144760 | 2007-02-09 | 10:14:50 |         1 |        1
 194.143.145.34  | 77.122.249.242  | 201144760 | 2007-02-09 | 10:14:50 |         1 |        2
 212.42.64.7     | 77.122.249.242  |      1367 | 2007-02-09 | 10:20:06 |         1 |        1
 212.42.64.7     | 77.122.249.242  |      1367 | 2007-02-09 | 10:20:06 |         1 |        2
 212.42.64.9     | 77.122.249.242  |       566 | 2007-02-09 | 10:20:06 |         1 |        1
 212.42.64.9     | 77.122.249.242  |       566 | 2007-02-09 | 10:20:06 |         1 |        2
 213.186.114.205 | 77.122.249.242  |       131 | 2007-02-09 | 10:44:48 |         1 |        1
 213.186.114.205 | 77.122.249.242  |       131 | 2007-02-09 | 10:44:48 |         1 |        2
 213.186.116.43  | 77.122.249.242  |       510 | 2007-02-09 | 15:32:16 |         1 |        1
................

Я такой уже раз получал, но он не верен, в колонке hostname должны быть все двойки:(
...
Рейтинг: 0 / 0
26.03.2007, 23:35
    #34416965
Skif Swarogich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос на выборку. Ошибка
Все, спасибо, разобрался:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
	temp.ip_from, temp.ip_to, temp.bytes, temp.date_ins, temp.time_ins, temp.interface, host.id as hostname, iface.id as interface
FROM 
	temp_table temp , host_table host, interface_table iface 
WHERE 
	temp.traff='ua' and host.id IN (
		SELECT host.id FROM temp_table temp , host_table host, interface_table iface 
		WHERE host.hostname=temp.host
	) and iface.id IN (
		SELECT iface.id FROM temp_table temp , host_table host, interface_table iface 
		WHERE iface.hostname IN (
			SELECT host.id FROM temp_table temp , host_table host, interface_table iface 
			WHERE host.hostname=temp.host
		) and iface.interface=temp.interface
	)
результат тот, что и нужен:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
     ip_from     |      ip_to      |   bytes   |  date_ins  | time_ins | interface | hostname | interface
-----------------+-----------------+-----------+------------+----------+-----------+----------+-----------
 194.143.145.34  | 77.122.249.242  | 201144760 | 2007-02-09 | 10:14:50 | rl0       |        2 |         1
 212.42.64.7     | 77.122.249.242  |      1367 | 2007-02-09 | 10:20:06 | rl0       |        2 |         1
 212.42.64.9     | 77.122.249.242  |       566 | 2007-02-09 | 10:20:06 | rl0       |        2 |         1
 213.186.114.205 | 77.122.249.242  |       131 | 2007-02-09 | 10:44:48 | rl0       |        2 |         1
 213.186.116.43  | 77.122.249.242  |       510 | 2007-02-09 | 15:32:16 | rl0       |        2 |         1
 213.186.117.169 | 77.122.249.242  |       199 | 2007-02-09 | 15:32:16 | rl0       |        2 |         1
 193.201.116.1   | 77.122.249.242  |       494 | 2007-02-09 | 10:15:20 | rl0       |        2 |         1
 195.149.112.1   | 77.122.249.242  |       540 | 2007-02-09 | 10:44:45 | rl0       |        2 |         1
 195.234.70.74   | 77.122.249.242  |   3507285 | 2007-02-09 | 10:12:31 | rl0       |        2 |         1

...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вложенный запрос на выборку. Ошибка / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]