我有一个表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_id
4220。但是在这种情况下,我不希望任何联接因为transaction_item
中的5行有amount < 2
。
答案 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_id
和transaction
,所以我想在这里...
要摆脱的主要见解: 总是 显示带有任何此类问题的确切表定义。