2010-03-03 480 views
5

给定一个数据库有两个表XY,我有一个查询,应该LEFT JOIN属性X.a1Y.b1上的两个表。我用下面的查询:MySQL问题:空表上的LEFT JOIN

SELECT X.a1, X.a2, Y.b1, Y.b2 FROM X LEFT JOIN Y ON (X.a1 = Y.b1) 

我认为这会是足够好的工作,即使Y目前是一个空表。但是,查询中断,因为表Y是空的。有什么办法来重新格式化这个查询,以便即使Y是一个空表,LEFT JOIN不会中断吗?或者我只需要始终确保表Y中有一些数据,即使它与表X(因此为LEFT JOIN)中的任何内容不匹配。

+0

对不起,我编辑了表格,使其更有意义。我头脑里有一个想法,把它搞砸了。 – ashays 2010-03-03 17:31:50

+0

我有一个类似的问题,下面poh的解决方案为我工作。 – jkinz 2013-08-02 15:27:08

回答

5

你的表名有点混乱。它是X和Y,还是X.a和Y.b?

如果X和Y:

SELECT X.a1, X.a2, Y.a1, Y.b2 FROM X LEFT OUTER JOIN Y ON (X.a1 = Y.b1) 

应带回所有的X,用空的Y.a1和Y.b2在没有匹配的记录。

+1

你知道还有其他左连接吗? :) LEFT JOIN =左外部连接 – Andrey 2010-03-03 17:05:16

+0

@Andrey IMO'OUTER'应该用在** outer **连接中,而不管RDBMS的快捷键。 – 2010-03-03 17:15:40

+0

我同意,但我认为它在目前的问题没有意义 – Andrey 2010-03-03 17:32:45

6

既然你没有发布你的实际SQL,我只是在这里做出假设。我的经验告诉我你可能有一个where子句导致SQL返回空集。

SELECT X.a1, X.a2, Y.b1, Y.b2 FROM X LEFT JOIN Y ON (X.a1 = Y.b1) 
WHERE Y.b3 = 'something' 

上述SQL将返回空结果集。您可能需要将SQL修改为以下格式,方法是将有问题的where子句调出到LEFT JOIN ON子句。

SELECT X.a1, X.a2, Y.b1, Y.b2 FROM X 
LEFT JOIN Y ON (X.a1 = Y.b1 and Y.b3 = 'something') 
+0

谢谢你,我有一个类似的问题,并修复它! – jkinz 2013-08-02 15:26:34

+0

只是要清楚 - 这实际上不会根据Y'东西'过滤结果;它会返回一个结果集,对所有的Y'东西'都有NULL。 – user2426679 2014-04-29 16:59:53

0

尝试在返回像 HeidiSQL或类似的错误一些SQL编辑您的查询。在我的情况下,问题是在WHERE子句中含糊不清的id。