繁体   English   中英

SQL LEFT JOIN和WHERE产生意外结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM