我有一个名为'status'的字段相关的两个表。如果table2.location的值为'texas',则有20个table2.status实例的值为'good'。
也就是说,以下查询返回20行table2.status ='good'。
[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas';
此外,还有50个唯一的table1.id,其中table1.status ='good'。
也就是说,以下查询返回50行唯一table1.id's。
[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]?
谢谢!
答案 0 :(得分:2)
如果您想获得50个项目,那么您的查询是错误的:您正在执行50x20的交叉加入,因此您有1000条记录。
你不能加入状态(这不是唯一的):可能你的桌面设计是错误的
IMO你应该在两个表中都有id并加入它......
答案 1 :(得分:2)
预计。表1的第1行与表2的50行匹配,表1的第2行再次匹配表2等的50行。
答案 2 :(得分:1)
您的查询有两个问题
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";
现在你的下一个问题是状态不太可能是你真正想要加入的东西。为了帮助您获得所需的结果,我们需要查看两个表的表结构。