我有一个(临时)表(我们称其为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分组
答案 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
)