如果满足条件,则联接表,否则不执行联接

时间:2020-06-10 09:49:09

标签: sql postgresql left-join

我有一个表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行,因为transaction_item表中的20行对应于transaction_id4220。但是在这种情况下,我不希望任何联接因为transaction_item中的5行有amount < 2

1 个答案:

答案 0 :(得分:1)

您的描述有些混乱,但标题显示:
“否则不执行加入”

所以我想你想要这样的东西:

collect_vars

但是,file3仅与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'; 列表中 right 表中的列组合在一起是可疑的。这样一来,您可以获得LEFT JOIN中每一行的所有NULL值均符合条件且在SELECT中没有匹配行的行,或者在{em> 中有一个或多个与{{1}匹配的行}。我怀疑您想要那个

通常,您需要在transaction列表中包含transaction_item中的列,或者改用amount < 2

所以可能是:

transaction

然后,表SELECT通常会包含一个引用[INNER] JOIN的FK列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

您同时提到了transaction_idtransaction,所以我想在这里...

要摆脱的主要见解: 总是 显示带有任何此类问题的确切表定义。