如果条件满足,则JOIN表,否则不执行连接。

问题描述 投票:0回答:1

我有一张桌子 transaction 和另一张表格 transaction_item.

一个事务有多个transaction_items。

我想左连接 transaction_item 如果 transaction_item.amount >= 2否则不执行连接。

select ti.*
from transaction t
LEFT JOIN transaction_item ti on ti.unique_id = t.unique_id  
    AND ti.location_id =  t.location_id 
    AND ti.transaction_date = t.transaction_date
    AND ti.amount >= 2
where t.pos_transaction_id = 4220
and t.location_id = 1674
and t.transaction_date = '2020-05-08';

如果我这样做,结果是15行代替了20行,因为20行是在 transaction_item 对应 transaction_id 4220. 但在这种情况下,我不想连接,因为5行在 transaction_itemamount < 2.

sql postgresql left-join
1个回答
1
投票

你的描述有点混乱,但标题上写着:" else perform no join"。"否则不执行连接"

所以我想你要的东西这个。

SELECT ti.*
FROM   transaction t
LEFT   JOIN transaction_item ti ON ti.unique_id        = t.unique_id  
                               AND ti.location_id      = t.location_id 
                               AND ti.transaction_date = t.transaction_date
                               AND NOT EXISTS (
                                    SELECT FROM transaction_item tx
                                    WHERE  tx.unique_id        = t.unique_id  
                                    AND    tx.location_id      = t.location_id 
                                    AND    tx.transaction_date = t.transaction_date
                                    AND    tx.amount < 2)  -- !
WHERE  t.pos_transaction_id = 4220
AND    t.location_id = 1674
AND    t.transaction_date = '2020-05-08';

然而, LEFT JOIN 与仅来自 正确的 表中 SELECT 列表是值得怀疑的。这样一来,你就会得到一行,每一行的值都是NULL。transaction 中没有匹配的记录。transaction_item 一行或多行相配的 amount < 2. 我怀疑你是否想要 .

通常情况下,你会希望包括来自于 transactionSELECT 列表,或使用 [INNER] JOIN 而不是。

所以可能是这样。

SELECT ti.*
FROM   transaction t
JOIN   transaction_item ti USING (unique_id, location_id, transaction_date)
WHERE  t.pos_transaction_id = 4220
AND    t.location_id = 1674
AND    t.transaction_date = '2020-05-08';
AND    NOT EXISTS (
   SELECT FROM transaction_item tx
   WHERE  tx.unique_id        = t.unique_id  
   AND    tx.location_id      = t.location_id 
   AND    tx.transaction_date = t.transaction_date
   AND    tx.amount < 2);

还有,一个表格 transaction_item 通常会有一个FK列 transaction_id 参考 transaction - 在这种情况下,我们可以简化

SELECT ti.*
FROM   transaction t
JOIN   transaction_item ti ON ti.transaction_id = t.transaction_id -- ?
WHERE  t.pos_transaction_id = 4220
AND    t.location_id = 1674
AND    t.transaction_date = '2020-05-08';
AND    NOT EXISTS (
   SELECT FROM transaction_item tx
   WHERE  tx.transaction_id = t.transaction_id
   AND    tx.amount < 2);

你都提到了 pos_transaction_idtransaction_id所以我在这里猜测......。

从中得到的主要启示。总是... 显示准确的表格定义与任何这样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.