[英]SQL LEFT JOIN and WHERE yields unexpected result
我有两个与名为“状态”的字段相关的表。 如果table2.location的值为“ texas”,则有20个table2.status实例的值为“ good”。
也就是说,以下查询返回table2.status ='good'的20行。
[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas';
此外,还有50个唯一的table1.id,其中table1.status ='good'。
也就是说,以下查询返回50行唯一的table1.id。
[B] SELECT table1.id FROM table1 WHERE table1.status = 'good';
现在,当我运行以下查询时:
[C] SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.status = table2.status WHERE table2.location = "texas";
我希望它返回50行唯一ID。 但是,它实际上是返回50行唯一ID的20次(即,我返回了1000行)。
我所做的快速修复是简单地执行SELECT DISTINCT table1.id ...,然后仅返回一组50行(而不是20组50行)。
但是,我想知道为什么会看到这种行为-我的查询[C]可能有问题吗?
谢谢!
如果要获取50个项目,则您的查询是错误的:您正在执行50x20的交叉联接,因此您有1000条记录。
您无法加入状态(这不是唯一的):可能您的表设计错误。
IMO,您应该在两个表中都具有id并将其加入...
这是预期的。 表1的第一行匹配表2的50行,表1的第二行再次匹配表2的相同50行,依此类推。
您的查询有两个问题
SELECT table1.id
FROM table1
LEFT JOIN table2 ON table1.status = table2.status
WHERE table2.location = "texas";
首先,当您使用左联接时,第二个表上的条件必须位于ON子句中,而不是where子句中,或者您将左联接转换为内部联接(因为必须满足条件)
因此,您的查询应开始如下所示:
SELECT table1.id
FROM table1
LEFT JOIN table2
ON table1.status = table2.status
AND table2.location = "texas";
现在,您的下一个问题是身份不太可能成为您真正想要加入的对象。 为了帮助您获得所需的结果,我们需要查看两个表的表结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.