我有一张桌子 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_item
有 amount < 2
.
你的描述有点混乱,但标题上写着:" 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
. 我怀疑你是否想要 该.
通常情况下,你会希望包括来自于 transaction
在 SELECT
列表,或使用 [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_id
和 transaction_id
所以我在这里猜测......。
从中得到的主要启示。总是... 显示准确的表格定义与任何这样的问题。