在我的职业生涯中,我第一次发现需要连接一个表连接的结果,第一个连接是内部连接,第二个是左外连接。
我来到这个解决方案:
SELECT * FROM
(
TableA INNER JOIN TableB ON
TableA.foreign = TableB.id
)
LEFT OUTER JOIN TableC
ON TableC.id = TableB.id
我知道我可以为第一次加入创建一个视图,但我不想在我的数据库中创建新对象。
这段代码对吗?我得到了连贯的结果,但我想验证它是否在理论上是正确的。 您有什么建议可以改进这种方法吗?
答案 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 强>