Как выполнить циклическое объединение выбора в Postgres

#database #postgresql

#База данных #postgresql

Вопрос:

Я пытаюсь выполнить select из Table2 для каждой строки в начальном операторе select из Table1.

Начальный select оператор будет выглядеть примерно так

Select * from Table1 Where GroupID='someId' AND ObjectID='someID'

Table1 вернет что-то вроде следующего (всегда будет только 0-1 возвращаемых строк с нулевым значением конечной даты).

введите описание изображения здесь

Таблица 2 будет выглядеть следующим образом

введите описание изображения здесь

По сути, моя цель — перебирать первые строки операторов select. Для каждой строки я хочу взять objectid, startdate и enddate, чтобы выбрать все соответствующие строки в Table2. Затем после выполнения ОБЪЕДИНЕНИЯ (?) для всех данных, которые я выбрал из таблицы2. Я хочу иметь возможность выбирать все строки в Table2, идентификатор объекта которых соответствует заданному идентификатору объекта, а временная метка находится между датами начала / окончания (или текущей временной меткой, если конечная дата равна нулю). Имеет ли это смысл? Я искал в Интернете, но не нашел способа добиться такого циклического объединения выбора.

Я не уверен, возможно ли это в одном операторе select или требуется ли сохраненный процесс / очиститель (любой из них подходит, но я бы предпочел избегать сохраненного процесса, если смогу).

Ответ №1:

Вы можете сделать это с помощью объединения:

 SELECT t2.*
FROM Table2 t2 INNER JOIN Table1 t1
ON t1.objectid = t2.objectid 
AND t2.timestamp BETWEEN t1.startdate AND COALESCE(t1.enddate, current_timestamp)
WHERE t1.GroupID = 'someId' AND t1.ObjectID = 'someID'
 

Комментарии:

1. Это прекрасно работает, спасибо! Не знал о функции объединения, так что спасибо вам и за это.