左连接和内连接组

lor*_*tol 6 sql oracle join inner-join left-join

说,我有以下查询:

SELECT * FROM TABLE1 
    JOIN TABLE2 ON ...
    LEFT JOIN TABLE3 ON ...
        JOIN TABLE3_1 ON ...
        JOIN TABLE3_2 ON ...
        JOIN TABLE3_3 ON ...
Run Code Online (Sandbox Code Playgroud)

我想要实现的是TABLE3,TABLE3_1,TABLE3_2,TABLE3_3内部连接(我只需要它们之间的所有匹配数据,其余的都没有).然后对于TABLE1,TABLE2也有内部连接.但是从TABLE1 + TABLE2结果来看,有些将没有相应的TABLE3条目,这没关系,我仍然会想要它.

如果按原样运行上面的伪代码,显然它不会达到相同的结果.

Ser*_*erg 11

使用paretheses强制连接顺序,种类

SELECT * 
FROM (
   TABLE1 
   JOIN TABLE2 ON ...)
LEFT JOIN (
    TABLE3 
    JOIN TABLE3_1 ON ...
    JOIN TABLE3_2 ON ...
    JOIN TABLE3_3 ON ...) ON ...
Run Code Online (Sandbox Code Playgroud)


Voj*_*nal 5

检查这个答案

@Serg 答案是正确的,但如果您ON在语句末尾指定条件,则不需要使用括号。

SELECT * FROM TABLE1 
    JOIN TABLE2 ON ...
    LEFT JOIN TABLE3 ON ThisConditionShouldBeAtTheEnd
        JOIN TABLE3_1 ON ...
        JOIN TABLE3_2 ON ...
        JOIN TABLE3_3 ON ...
Run Code Online (Sandbox Code Playgroud)

你这样重写:

SELECT * FROM TABLE1 
    JOIN TABLE2 ON ...
    LEFT JOIN TABLE3 
        JOIN TABLE3_1 ON ...
        JOIN TABLE3_2 ON ...
        JOIN TABLE3_3 ON ...
    ON ThisConditionShouldBeAtTheEnd
Run Code Online (Sandbox Code Playgroud)

另请参阅本文以获取更多解释。原因是 JOIN 条件是从左到右(自上而下)评估的,您需要在先前的内部连接之后评估 LEFT 连接条件。