内连接和常规表的外左连接

时间:2014-01-17 11:58:57

标签: mysql sql join left-join

在我的职业生涯中,我第一次发现需要连接一个表连接的结果,第一个连接是内部连接,第二个是左外连接。

我来到这个解决方案:

SELECT * FROM
(
    TableA INNER JOIN TableB ON
    TableA.foreign = TableB.id
)
LEFT OUTER JOIN TableC
ON TableC.id = TableB.id

我知道我可以为第一次加入创建一个视图,但我不想在我的数据库中创建新对象。

这段代码对吗?我得到了连贯的结果,但我想验证它是否在理论上是正确的。 您有什么建议可以改进这种方法吗?

4 个答案:

答案 0 :(得分:2)

你应该以更简单的方式做到这一点。

SELECT * FROM
TableA
INNER JOIN TableB ON TableA.foreign = TableB.id
LEFT OUTER JOIN TableC ON TableB.id = TableC.id

通常以这种方式完成。

答案 1 :(得分:1)

我相信你正在寻找这样的东西:

SELECT *, t.otherFields
FROM
(
    SELECT TableB.id, otherFields FROM TableA
    INNER JOIN TableB ON
    TableA.foreign = TableB.id
) t
LEFT OUTER JOIN TableC
ON TableC.id = t.id

答案 2 :(得分:1)

SELECT * 
FROM TableA 
    INNER JOIN TableB ON
        TableA.foreign = TableB.id
LEFT OUTER JOIN TableC
    ON TableC.id = TableB.id

也很好

答案 3 :(得分:1)

是的,它是正确的,但它与没有括号的相同(更简单)查询没什么不同:

SELECT  * 
FROM    TableA 
        INNER JOIN TableB 
            ON TableA.foreign = TableB.id
        LEFT OUTER JOIN TableC
            ON TableC.id = TableB.id;

<强> SQL Fiddle showing both queries with the same result

另外值得注意的是,两个查询都具有完全相同的执行计划

当您需要在内部联接的结果上保持联接时使用括号,例如:如果你只想返回表b中的结果,其中tableC中有记录,但仍然保持连接到TableA,你可能会写:

SELECT  * 
FROM    TableA 
        LEFT OUTER JOIN TableB 
            ON TableA.foreign = TableB.id
        INNER JOIN TableC
            ON TableC.id = TableB.id;

然而,由于下面的INNER JOIN,这有效地将TableB上的LEFT OUTER JOIN转换为INNER JOIN。在这种情况下,您将使用括号根据需要更改JOIN:

SELECT  * 
FROM    TableA 
        LEFT OUTER JOIN (TableB 
        INNER JOIN TableC
            ON TableC.id = TableB.id)
            ON TableA.foreign = TableB.id;

<强> SQL Fiddle to show difference in results when adding parentheses