Форум системных администраторов

IT => Software => СУБД => Тема начата: diggerzz от 01 сентября 2017, 12:55:34

Название: PostgreSQL - объединить два запроса
Отправлено: diggerzz от 01 сентября 2017, 12:55:34
День добрый.

Подскажите пожалуйста, как бы сделать во так бы...

Есть БД Zabbix 3.4.0, которая крутится на PostgreSQL 9.2.15
Есть два запроса
select hostid, name from hosts where name like '1_MY_TEMPLATE%' order by name;
и
select itemid, name, key_, history, trends from items where hostid=<hostid_из_первого_запроса>  order by name;
Как бы перебрать в цикле все hostid полученные первым запросом, последовательно подставляя их во второй?
На выходе хочется получить таблицу состоящую из результатов второго запроса по всем id-шникам первого.
Название: PostgreSQL - объединить два запроса
Отправлено: sirarthur от 01 сентября 2017, 13:16:54
union ?
https://postgrespro.ru/docs/postgrespro/9.5/queries-union
Название: PostgreSQL - объединить два запроса
Отправлено: shurutov от 01 сентября 2017, 13:22:35
PostgreSQL 9.2.15
10-ка на подходе, имеет смысл задуматься об обновлении, однако. Много чего хорошего включили, да и скорости серьёзно добавили.
select
i.itemid,
i.name,
i.key_,
i.history,
i.trends
from items i
inner join hosts h on i.hostid=h.hostid
where h.name like '1_MY_TEMPLATE%'
order by i.name;
Навскидку как-то так.


Updated: 01 September 2017, 13:24:06

sirarthur, у диггерза не юнион, у него классический джойн. А в юнионе оба запроса должны возвращать идентичные наборы полей.
Название: PostgreSQL - объединить два запроса
Отправлено: .05 от 01 сентября 2017, 13:24:09
union ?
Не union - это прям объединить, т.е. было 5 записей + 3 - стало 8.
Тут join нужен
Название: PostgreSQL - объединить два запроса
Отправлено: shurutov от 01 сентября 2017, 13:27:20
А
inner join hosts h on i.hostid=h.hostid
, при одинаковом наименовании поля вполне себе допустимо записать так:
inner join hosts h USING(hostid)
Ну и дока: https://postgrespro.ru/docs/postgrespro/9.6/queries-table-expressions.html
П. "7.2.1.1. Соединённые таблицы"
Название: PostgreSQL - объединить два запроса
Отправлено: diggerzz от 01 сентября 2017, 14:57:30
Вот так вот, все получилось вообще красиво и прям как надо.
select
        h.name,
i.itemid,
i.name,
i.key_,
i.history,
i.trends
from items i
inner join hosts h on i.hostid=h.hostid
where h.name like '1_MY_TEMPLATE%'
order by i.name;

Всем спасибо, особенно shurutov!

Ну и дока: https://postgrespro.ru/docs/postgrespro/9.6/queries-table-expressions.html
П. "7.2.1.1. Соединённые таблицы"
Спасибо.

P.S. С join-ами я знаком немного, просто почему-то переклинило, что тут нужен цикл с передачей в него h.hostid как переменной.
А вот цикл я уже не осилил.  :D
Название: PostgreSQL - объединить два запроса
Отправлено: shurutov от 01 сентября 2017, 15:14:37
цикл
это вот здеся: https://postgrespro.ru/docs/postgrespro/9.6/plpgsql-control-structures.html
а заодно неименованные блоки кода: https://postgrespro.ru/docs/postgrespro/9.6/sql-do
Осваивай и страдай, ибо во многом знании - многия печали.  :trollface:
И уйти от императивного погромизма в декларативное - это ещё то приключение.