Oracle SQL中的这两个左连接是否有区别?为什么

Cos*_*min 3 sql oracle left-join

SELECT * 
FROM TAB1 
LEFT JOIN TAB2 ON TAB2.ID_TAB1 = TAB1.ID 
JOIN TAB3 ON TAB3.ID = TAB2.ID_TAB3;
Run Code Online (Sandbox Code Playgroud)

SELECT *
FROM TAB1
LEFT JOIN (SELECT *
           FROM TAB2
           JOIN TAB3 ON TAB3.ID = TAB2.ID_TAB3) T
ON T.ID_TAB1 = TAB1.ID;
Run Code Online (Sandbox Code Playgroud)

小智 9

不,它们是不同的 - 第一个查询中对TAB3的内连接(左连接到TAB2之后)有效地将左连接转回到内连接.

第二个查询中的括号确保在左连接之前评估到TAB3的内连接- 因此它仍然是TAB2的左连接,返回那些存在相应TAB3记录的TAB2记录(否则,返回TAB1记录对应的NULL).

  • 好吧,你总是可以写信给Oracle(以及其他数据库提供商和ANSI)并告诉他们他们做错了...... (3认同)
  • @CosminVacaroiu:换句话说:在第一个查询中,您首先将TAB1连接到TAB2;*then*,通过将这两个表连接在一起产生的数据集本身就是基于TAB2中的字段与TAB3内部连接**.由于这些字段在TAB2记录不存在的情况下将为NULL,因此您将尝试在条件"TAB3.ID = NULL"的情况下内部连接到TAB3,*从不*计算为真. (3认同)