我正在尝试检索两组信息(一个查询中图表的红色和蓝色部分。
我以为我可以使用如下所述的sql来做它但是当TableC没有记录时它不会返回任何东西。如果TableC没有记录,我仍然希望此查询返回BLUE区域指示的结果。
SELECT A. * FROM TableA A
加入表B B ON(A.id = B.a_id)
加入TableC C ON(A.id = C.a_id)
感谢任何指针将红色和/或蓝色片段返回给我。在此先感谢=]
答案 0 :(得分:20)
尝试这样的事情
SELECT A.* FROM TableA A
LEFT OUTER JOIN TableB B ON (A.id = B.a_id)
LEFT OUTER JOIN TableC C ON (A.id = C.a_id)
WHERE B.a_id IS NOT NULL
OR c.a_id IS NOT NULL
答案 1 :(得分:9)
要理解当TableC
没有记录时你没有得到任何结果的原因,你需要了解一下SQL中的JOIN类型。
基本上,当您发出查询时
TableA A JOIN TableB B ON A.id = B.a_id
您告诉数据库查看TableA
和TableB
并获取满足连接谓词的所有行对(A.id = B.a_id)。因此,如果TableB
为空,则数据库无法使用前面提到的标准查找和对行。
这种类型的JOIN称为 INNER JOIN ,它是最常用的连接操作类型。
在您的情况下,您希望从TableA X TableB
获取所有行以及TableC
中的所有相关行,如果存在此类行(基于连接预测“A.id = C.a_id”。这是 OUTER JOIN 的情况。这种连接的两种最常见类型是LEFT JOIN(包括左表中的所有行) )和RIGHT JOIN(包括右表中的所有行)。
在这种情况下,您的查询应为:
SELECT A.*
FROM
(TableA A JOIN Table B B ON A.id = B.a_id)
LEFT JOIN TableC C ON A.id = C.a_ID
如果您想了解有关SQL中连接类型的更多信息,我建议您查看relevant Wikipedia页面
修改强>
通过遵循相同的逻辑,如果您想拥有TableA
中的所有行以及表TableB
和TableC
中的相关行(如果它们存在),您的查询将变为:
SELECT A.*
FROM
(TableA A LEFT JOIN Table B B ON A.id = B.a_id)
LEFT JOIN TableC C ON A.id = C.a_ID