PostgreSQL SELECT WHERE IN子查询具有来自其他列的自身条件

时间:2019-02-03 16:14:40

标签: php sql postgresql

我有一个(临时)表(我们称其为param),其记录如下所示

BranchID |       DateFrom      |       DateTo
   154   | 2019-01-01 00:00:00 | 2019-01-01 23:59:59
   361   | 2019-01-01 00:00:00 | 2019-01-01 23:59:59
   362   | 2019-01-01 10:00:00 | 2019-01-02 09:59:59

现在,如果我想选择那些分支机构可以完成的所有交易

SELECT *
FROM "Transaction" t
WHERE t."BranchID" IN (SELECT "BranchID" FROM param)

但是我希望我的选择仅限于那些datefrom和dateto。但是,如果datefrom和dateto对于每个分支都是通用的,我们可以做类似的事情

SELECT *
FROM "Transaction" t
WHERE t."BranchID" IN (SELECT "BranchID" FROM param)
AND t."TransactionDate" >= '2019-01-01 00:00:00'::TIMESTAMP
AND t."TransactionDate" <= '2019-01-01 23:59:59'::TIMESTAMP

但是问题是每个分支都有自己的结束日期(如表param中所示)。是否可以在像上面这样的一个查询中做到这一点?如果可能的话,我不想在php中像从表参数中执行foreach一样对它进行处理,并为每一行(分支)执行事务查询,因为这会增加执行时间(尤其是当我们有超过100个分支时),所以我想所有分支的1个大选择,然后使用PHP分组

1 个答案:

答案 0 :(得分:2)

您可以使用JOIN

SELECT t.*
 FROM "Transaction" t JOIN param p 
 ON p."BranchID" = t."BranchID"
AND t."TransactionDate" >= p.DateFrom
AND t."TransactionDate" <= p.DateTo

EXISTS也应该可以正常工作。

SELECT t.*
     FROM "Transaction" t WHERE EXISTS 
( SELECT 1 FROM param p 
     WHERE p."BranchID" = t."BranchID"
    AND t."TransactionDate" >= p.DateFrom
    AND t."TransactionDate" <= p.DateTo
)