#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. Это прекрасно работает, спасибо! Не знал о функции объединения, так что спасибо вам и за это.