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

wwwo4jvm  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(269)

我有一张table transaction 还有一张table transaction_item .
一个事务有多个事务项。
我想离开加入 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 .

kmb7vmvb

kmb7vmvb1#

你的描述有点混乱,但标题说:
“否则不执行联接”
所以我想你想要这样的东西:

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 这个名单充其量是可疑的。这样就得到一行,其中的每一行都有空值 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);

再来一张table 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 ,所以我猜。。。
从中获得的主要见解是:对于任何此类问题,始终显示精确的表定义。

相关问题