加入三张桌子

时间:2010-07-12 08:36:39

标签: sql mysql database

我正在尝试检索两组信息(一个查询中图表的红色和蓝色部分。

我以为我可以使用如下所述的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)

感谢任何指针将红色和/或蓝色片段返回给我。在此先感谢=]

2 个答案:

答案 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

您告诉数据库查看TableATableB并获取满足连接谓词的所有行对(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中的所有行以及表TableBTableC中的相关行(如果它们存在),您的查询将变为:

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