繁体   English   中英

内部联接和常规表的外部左联接

[英]Outer left join of inner join and regular table

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

我来到这个解决方案:

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

我知道我可以为第一个联接创建一个视图,但是我不想在数据库中创建新对象。

这个代码正确吗? 我得到了一致的结果,但我想验证一下理论上是否正确。 您对改进这种方法有什么建议吗?

您应该以更简单的方式进行操作。

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

通常是通过这种方式完成的。

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

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
SELECT * 
FROM TableA 
    INNER JOIN TableB ON
        TableA.foreign = TableB.id
LEFT OUTER JOIN TableC
    ON TableC.id = TableB.id

还可以

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

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

SQL Fiddle显示两个具有相同结果的查询

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

当您需要对内部联接的结果进行左联接时,会使用括号,例如,如果您只想返回表c中有记录的表b的结果,但仍然对表A保持联接,则可以这样写:

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小提琴在添加括号时显示结果差异

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM