构造一个既可以使用特定表也可以不使用特定表的查询

时间:2012-12-17 21:31:39

标签: mysql sql

我在做一个系统,我在一个查询中加入了几个表。 在大多数情况下,以下类型的查询都可以解决问题:

     SELECT * FROM A JOIN B ON A.a = B.a JOIN C ON C.a = A.a WHERE A.a = 123;  

属性A.a是PK,在B.a和C.a中用作FK。

在某些情况下,没有相应的B.a和C.a.在其他人中,只有C.a失踪了。 就像现在一样,如果B或C中没有对应的键,我得到一个空集。正如所料。

如果仅存在A,则生成仅具有A属性的集合的查询将是方便的,如果A.a = B.a等,则添加B和C属性。

我想这需要一个DBMS特定的解决方案,而不是一般的SQL,但我不确定。

如果可能,应该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

你想要这个:

SELECT *
FROM A LEFT OUTER JOIN
     B
     ON A.a = B.a LEFT OUTER JOIN
     C
    ON C.a = A.a
WHERE A.a = 123

left outer join保留第一个表中的所有记录(“左侧”中的记录)和右侧的任何匹配表。您可以在任何表中引用列。如果没有匹配,则该值为NULL。

答案 1 :(得分:1)

这种连接称为outer(与默认的连接类型相反,称为 inner )。

以下是告诉SQL您需要外连接的方法:

SELECT * FROM A
LEFT OUTER JOIN B ON A.a = B.a
LEFT OUTER JOIN C ON C.a = A.a WHERE A.a = 123;  

这告诉SQL即使缺少BC(或两者)的相应行,您仍然需要任何可用的行。