2016-11-29 68 views
1

我有以下查询:SQL联接返回领域与空值

SELECT * 
FROM tableA.A 
LEFT JOIN tableB AS B ON B.id=A.id 
LEFT JOIN tableC AS C ON C.id=A.id2 
LEFT JOIN tableD AS D ON D.id=A.id3 
WHERE D.id = '124' AND A.field = 1 
GROUP BY A.id ORDER BY D.sortorder 

上面的结构是同文同我真正的查询,我想提一提,我在查询中使用的所有表都有效和行填充数字和字母字符。任何地方都没有NULL值。

的问题是,当我执行此查询,则返回一个NULL值某些字段,即使它们不为空。

我试图解释,因为我可以一样好,但它是一个奇怪的行为,我无法找到任何谷歌。

如果它不是一个普遍的问题,很难发现其中的错误,也许一些建议会帮助我找到的bug。

预先感谢您

UPDATE我想apologize.The问题是由在桌子上一年底的进入造成的,这就是为什么它返回NULL,因为实际上没有match.Thank您的帮助

+1

切勿对'GROUP BY'使用'SELECT *'。这表明你不知道你在做什么。 –

+0

@GordonLinoff,在我的代码我用一些特定的领域,他们中的一些具有相同的名称,这是集团的目的而 –

+0

@PeterCos - 这是相当混乱的念想,因为正如所写的,您的查询就会抛出一个错误。对于我们来说,如果你输入一些列名称以及如何对它们进行分组,那么对于我们来说会更容易。 – kbball

回答

1

尝试此查询:

SELECT * 
FROM tableA.A 
LEFT JOIN tableB AS B ON B.id=A.id 
LEFT JOIN tableC AS C ON C.id=A.id2 
LEFT JOIN tableD AS D ON D.id=A.id3 and D.id = '124' 
WHERE A.field = 1 
GROUP BY A.id 
ORDER BY COALESCE(D.sortorder,0) 

条件上LEFT JOIN的右表应放在ON子句中,而不是WHERE条款。

如果这也不行,那我的事,你误会了LEFT JOIN目的。它用于保留全部来自主表的记录(您的情况为A)和丢弃所有与详细表不匹配的数据,因此,在不匹配fouhd时会有NULL的值。

+0

如果我正在更改它,右表状态不起作用。 –

+0

当您将条件放在WHERE而不是ON时,连接变成了INNER JOIN。您可以用另一个选择来包装查询,然后对其进行过滤。 – sagi

+0

是的,我知道,但在D桌上,我得到的字段与id中的某个表相匹配,并且我使用另一个字段来提取一些匹配的字段,这就是D.id = 124的目的。但它不会返回我所需要的,因为某些返回的字段在它们不应该时为空。在D表中,这些值的值为124 –