gpt4 book ai didi

mysql - LEFT JOIN 不考虑 ON 子句

转载 作者:行者123 更新时间:2023-11-29 02:22:15 27 4
gpt4 key购买 nike

我下面的查询用于检索客户已订购和退回的商品列表。我对最后一个连接 ReturnCustomer 感到困惑,我希望查询返回带有 status = 20 的数据,否则返回 NULL。以下是我的查询:

SELECT Product.id AS product_id, Product.supplier_product_id AS vip_id, Product.name AS product_name, detailSO.qty, detailRC.return_qty
FROM Product
RIGHT JOIN detailSO ON detailSO.product_id = Product.id
RIGHT JOIN SalesOrder ON SalesOrder.id = detailSO.so_id AND SalesOrder.status >= 20
LEFT JOIN detailRC ON detailRC.sur_key = detailSO.sur_key
LEFT JOIN ReturnCustomer ON ReturnCustomer.id = detailRC.rc_id AND ReturnCustomer.status >= 20

如果我使用 LEFT JOIN,它不会考虑 ReturnCustomer.status >= 20 因为它返回所有数据。另一方面,如果我使用 RIGHT JOIN,它只会返回 ReturnCustomer.status >= 20 的数据,

LEFT JOIN 结果:

P_id    Pp_id   P_name  i_qty   r_qty
P000001 P000001 Item 1 15 1
P000001 P000001 Item 1 5 1
P000002 P000002 Item 2 5 NULL

RIGHT JOIN 结果:

P_id    Pp_id   P_name  i_qty   r_qty
P000001 P000001 Item 1 15 1

预期结果:

P_id    Pp_id   P_name  i_qty   r_qty
P000001 P000001 Item 1 15 1
P000001 P000001 Item 1 5 NULL <-- null since it comes from ReturnCustomer with status = 0
P000002 P000002 Item 2 5 NULL

我知道也许我可以使用嵌套查询来解决这个问题,希望你们能为我提供更好的解决方案。提前致谢

更新:这是我的简化问题 sqlfiddle ..

最佳答案

a LEFT JOIN b 的工作方式与此完全相同..(a 将始终存在,其中 b 可能为 null)

ON 仅适用于删除 b,其中 a 不会受到影响..

WHERE 通过删除行来工作

所以当

 A have 1,2,3
B have 1,2
C have 1,3

例如,当这三个人离开时:

 SELECT *
FROM A
LEFT JOIN B ON A.x = B.x
LEFT JOIN C ON B.x = C.x

它会给出:

 A B C
1 1 1
2 2
3

如果第二个LEFT JOIN连接到A,例如:

 SELECT *
FROM A
LEFT JOIN B ON A.x = B.x
LEFT JOIN C ON A.x = C.x

它会给出:

 A B C
1 1 1
2 2
3 3

最后一个 ON 上的任何更多条件都不会删除 B 部分,因为它之前已经加入,WHERE 部分上的任何条件都将删除整行。

在你的情况下,如果你想隐藏 B 部分,你不应该使用 ONWHERE,正确的是在 SELECT 部分使用 CASE WHEN,例如:

SELECT detailSO.product_id
, detailSO.qty
, CASE WHEN RC.id IS NULL THEN NULL ELSE detailRC.qty END AS x
FROM SO
LEFT JOIN detailSO ON detailSO.so_id = SO.id
LEFT JOIN detailRC ON detailRC.sur_key = detailSO.sur_key
LEFT JOIN RC ON RC.id = detailRC.rc_id AND RC.status >= 20
WHERE SO.status >= 20

sql Fiddle 中的结果

product_id  qty x
P00001 15 1
P00001 5 (null)
P00002 5 (null)

关于mysql - LEFT JOIN 不考虑 ON 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29769003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com