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

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

我有一张table transaction 还有一张table transaction_item .
一个事务有多个事务项。
我想离开加入 transaction_item 如果 transaction_item.amount >= 2 ,否则不执行连接。

  1. select ti.*
  2. from transaction t
  3. LEFT JOIN transaction_item ti on ti.unique_id = t.unique_id
  4. AND ti.location_id = t.location_id
  5. AND ti.transaction_date = t.transaction_date
  6. AND ti.amount >= 2
  7. where t.pos_transaction_id = 4220
  8. and t.location_id = 1674
  9. and t.transaction_date = '2020-05-08';

如果我这样做的话,结果是15行,而不是总共20行,因为20行在 transaction_item 对应表 transaction_id 4220但我不想加入这个案子因为有5行 transaction_itemamount < 2 .

kmb7vmvb

kmb7vmvb1#

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

  1. SELECT ti.*
  2. FROM transaction t
  3. LEFT JOIN transaction_item ti ON ti.unique_id = t.unique_id
  4. AND ti.location_id = t.location_id
  5. AND ti.transaction_date = t.transaction_date
  6. AND NOT EXISTS (
  7. SELECT FROM transaction_item tx
  8. WHERE tx.unique_id = t.unique_id
  9. AND tx.location_id = t.location_id
  10. AND tx.transaction_date = t.transaction_date
  11. AND tx.amount < 2) -- !
  12. WHERE t.pos_transaction_id = 4220
  13. AND t.location_id = 1674
  14. AND t.transaction_date = '2020-05-08';

然而 LEFT JOIN 仅与 SELECT 这个名单充其量是可疑的。这样就得到一行,其中的每一行都有空值 transaction 符合条件且中没有匹配行的 transaction_item 或一个或多个匹配行 amount < 2 . 我怀疑你想要那个。
通常,您需要包含 transactionSELECT 列出,或使用 [INNER] JOIN 相反。
所以可能是:

  1. SELECT ti.*
  2. FROM transaction t
  3. JOIN transaction_item ti USING (unique_id, location_id, transaction_date)
  4. WHERE t.pos_transaction_id = 4220
  5. AND t.location_id = 1674
  6. AND t.transaction_date = '2020-05-08';
  7. AND NOT EXISTS (
  8. SELECT FROM transaction_item tx
  9. WHERE tx.unique_id = t.unique_id
  10. AND tx.location_id = t.location_id
  11. AND tx.transaction_date = t.transaction_date
  12. AND tx.amount < 2);

再来一张table transaction_item 通常会有一个fk列 transaction_id 引用 transaction -在这种情况下我们可以简化

  1. SELECT ti.*
  2. FROM transaction t
  3. JOIN transaction_item ti ON ti.transaction_id = t.transaction_id -- ?
  4. WHERE t.pos_transaction_id = 4220
  5. AND t.location_id = 1674
  6. AND t.transaction_date = '2020-05-08';
  7. AND NOT EXISTS (
  8. SELECT FROM transaction_item tx
  9. WHERE tx.transaction_id = t.transaction_id
  10. AND tx.amount < 2);

你两个都提到了 pos_transaction_id 以及 transaction_id ,所以我猜。。。
从中获得的主要见解是:对于任何此类问题,始终显示精确的表定义。

展开查看全部

相关问题