2012-02-15 77 views
0

我有两个表与一个名为'status'的字段相关。在table2.location的值为'texas'的情况下,有20个table2.status实例的值为'good'。SQL LEFT JOIN和WHERE产生意想不到的结果

也就是说,以下查询返回20行table2.status ='good'。

[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas'; 

此外,还有50个独特的table1.id与table1.status = '好'。

也就是说,以下查询返回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行唯一标识的20次(即我返回了1000行)。

我做的快速修复只是简单地执行SELECT DISTINCT table1.id ...然后只返回一组50行(不是20组50行)。

但是,我想知道为什么我看到这个行为 - 也许我的查询[C]有问题吗?

谢谢!

回答

1

你的查询有两个问题

SELECT table1.id 
FROM table1 
LEFT JOIN table2 ON table1.status = table2.status 
WHERE table2.location = "texas"; 

首先,当你USAE左加入第二台的条件必须是ON子句中的WHERE子句或将转换为左连接到内部连接(由于条件必须得到满足)

所以您的查询应该开始寻找这样的:

SELECT table1.id 
FROM table1 
LEFT JOIN table2 
    ON table1.status = table2.status 
    AND table2.location = "texas"; 

现在你的下一个问题是,状态不太可能成为你真正想要加入的东西。为了帮助您获得所需的结果,我们需要查看两个表的表结构。

2

如果您想获得50个项目:您正在执行交叉连接50x20,因此您有1000条记录作为结果,您的查询是错误的。
你无法加入状态(这不是唯一的):可能你的餐桌设计是错误的。
国际海事组织你应该有两个表中的编号,并加入它...

2

它是预期的。从表1中第一行从表2中,第二排50行从表1再次匹配匹配由表2等相同的50行

相关问题