如何在 Postgres 中进行循环选择联合

Posted

技术标签:

【中文标题】如何在 Postgres 中进行循环选择联合【英文标题】:How to do a looping select union in Postgres 【发布时间】:2020-11-20 16:59:33 【问题描述】:

我正在尝试在 Table1 的初始选择语句中为每一行从 Table2 中选择。

初始的select 语句看起来像

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

Table1 将返回类似于以下内容的内容(只会返回 0-1 个 EndDate 值为空的行)。

Table2 如下所示

基本上我的目标是遍历第一个选择语句行。对于每一行,我想使用 objectidstartdateenddate 来选择 Table2 中所有适当的行。然后对我从表 2 中选择的所有数据执行 UNION(?)。我希望能够选择 Table2 中的所有行,这些行的 objectid 与给定的 objectid 匹配,并且时间戳位于开始/结束日期之间(如果 enddate 为空,则为当前时间戳)。那有意义吗?我一直在网上找,但没有找到一种方法来实现这样的循环选择联合。

我不确定这是否可以在单个 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'

【讨论】:

这很好用,谢谢!不知道 COALESCE 功能,所以也谢谢你。

以上是关于如何在 Postgres 中进行循环选择联合的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Postgres 在 SQL 中执行 for 循环?

Postgres:如何在 Have 子句中进行 NULL 友好的 MIN 过滤以准确选择一行?

如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?

在 Laravel Eloquent 中,你如何在联合范围之外进行两个联合查询和一个选择?

如何在 postgres 中对相同的 CTE 表达式执行 UNION ALL?

如何在 Postgres 中删除表的所有索引?