Автор Тема: PostgreSQL - объединить два запроса  (Прочитано 564 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Онлайн diggerzz

  • Пользователь
  • **
  • Сообщений: 74
  • Рейтинг: 3
  • Пол: Мужской
  • Простой и добрый ватник
    • Просмотр профиля
  • Откуда: Москва
PostgreSQL - объединить два запроса
« : 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-шникам первого.

Оффлайн sirarthur

  • Постоялец
  • ***
  • Сообщений: 469
  • Рейтинг: 4
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: sub-MSK

Оффлайн shurutov

  • Постоялец
  • ***
  • Сообщений: 275
  • Рейтинг: 2
  • Пол: Мужской
    • mshurutov@jabber.ru
    • Просмотр профиля
  • Откуда: МО
PostgreSQL - объединить два запроса
« Ответ #2 : 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, у диггерза не юнион, у него классический джойн. А в юнионе оба запроса должны возвращать идентичные наборы полей.
С уважением,
Шурутов Михаил.

Оффлайн .05

  • Постоялец
  • ***
  • Сообщений: 128
  • Рейтинг: 2
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Сибирь
PostgreSQL - объединить два запроса
« Ответ #3 : 01 Сентября 2017, 13:24:09 »
union ?
Не union - это прям объединить, т.е. было 5 записей + 3 - стало 8.
Тут join нужен
Разное

Оффлайн shurutov

  • Постоялец
  • ***
  • Сообщений: 275
  • Рейтинг: 2
  • Пол: Мужской
    • mshurutov@jabber.ru
    • Просмотр профиля
  • Откуда: МО
PostgreSQL - объединить два запроса
« Ответ #4 : 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. Соединённые таблицы"
С уважением,
Шурутов Михаил.

Онлайн diggerzz

  • Пользователь
  • **
  • Сообщений: 74
  • Рейтинг: 3
  • Пол: Мужской
  • Простой и добрый ватник
    • Просмотр профиля
  • Откуда: Москва
PostgreSQL - объединить два запроса
« Ответ #5 : 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
« Последнее редактирование: 01 Сентября 2017, 15:29:29 от diggerzz »

Оффлайн shurutov

  • Постоялец
  • ***
  • Сообщений: 275
  • Рейтинг: 2
  • Пол: Мужской
    • mshurutov@jabber.ru
    • Просмотр профиля
  • Откуда: МО
PostgreSQL - объединить два запроса
« Ответ #6 : 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:
И уйти от императивного погромизма в декларативное - это ещё то приключение.
С уважением,
Шурутов Михаил.