【发布时间】:2020-12-13 23:40:07
【问题描述】:
查询返回意外结果:为什么?
订单表:
+----------------+
| Field |
+----------------+
| orderNumber |
| customerNumber |
+----------------+
订单明细表:
+-----------------+
| Field |
+-----------------+
| orderNumber |
| productCode |
+-----------------+
考虑以下查询:
SELECT
o.orderNumber,
o.customerNumber,
d.orderNumber,
d.productCode
FROM
orders o
LEFT JOIN orderdetails d
ON ((o.orderNumber = d.orderNumber) AND (o.orderNumber = 10123)) ;
结果如下:
我希望看到 orderNumber 仅为 10123 的行
为什么我们会看到其他订单号?我会认为连接的条件(即o.orderNumber = 10123)应该排除那些其他行?这对我来说真的很奇怪,很奇怪,结果出乎意料:任何对正在发生的事情的澄清将不胜感激。
更新 - 将条件添加到 WHERE 子句
确实,我可以将o.orderNumber = 10123 添加到 WHERE 子句中,这样可以解决问题,但我担心的是,当包含在 ON 子句中时,它应该仍然可以正常工作,应该不是吗?为什么?因为在 o.orderNumber 不是 10123 的情况下条件会返回 false,因此应该从结果集中排除?
更新:可重现的示例:
这里是mysql数据库:https://sp.mysqltutorial.org/wp-content/uploads/2018/03/mysqlsampledatabase.zip
这是一个在线版本,您可以在其中输入命令:https://www.mysqltutorial.org/tryit/
谢谢!
【问题讨论】:
-
join有几种类型...使用前需要了解它们的用法...
-
您的语法有点奇怪。不要在您的 ON 子句中包含 (o.orderNumber = 10123)。加入后将其移动到 WHERE。
-
我会将
o.orderNumber = 10123移出JOIN并移至WHERE,因为它与您要加入的表无关 -
您在 JOIN 本身上使用
(o.orderNumber = 10123),而不是WHERE o.orderNumber = 10123。 -
解释为什么你期望你所期望的,或者你只是要求另一个 LEFT JOIN 的演示,而我们不知道你的误解/误解在哪里。通过参考权威文档来证明您的期望,或者您没有进行适当的研究和解释。这是一个代码问题,所以请给minimal reproducible example。这包括前面的加上代码和输出作为文本,我们可以从您的帖子中剪切&粘贴&运行&差异&你剪切&粘贴&运行。 PS LEFT JOIN ON 返回 INNER JOIN ON 行 UNION ALL 由 NULL 扩展的不匹配的左表行。知道哪个 INNER JOIN ON。
标签: mysql sql left-join where-clause