在 Oracle 查询中将联接从 Where 子句移动到 From 子句

Move joins from Where clause to From clause in an Oracle query

我有以下 Oracle 查询,我想将联接从 Where 子句移动到 From 子句

select 
    * 
from
    A, B, C
where
    A.a (+)= B.a
    AND A.b (+) = B.b
    AND A.b = C.b;

所以我提出了以下查询

select
    *
from
    C,
    B left join A on (B.a = A.a and B.b = A.b and C.b = A.b);

我想知道这两个查询在语义上是否相同以及两者是否会输出相同的结果

*** 编辑:尝试 2

select
    *
from    
    B left join A on (B.a = A.a and B.b = A.b)
    inner join C on C.b = A.b;

您可能打算将此查询作为:

select * 
from B left join
     A
     using (a, b) left join
     C
     using (b)

在旧的 Oracle 连接语法中,(+) 将应用于外部连接 table 的所有列。因此,在您的原始查询中,table A 外连接到 table B,因为

FROM a, b
WHERE a.a (+) = b.a AND a.b (+) = b.b

FROM b
LEFT join a ON a.a = b.a AND a.b = b.b

但是您的查询中的 AND a.b = c.b 使这仅仅是一个内连接,因为它必须是 AND a.b (+) = c.b 才能正常工作(在这种情况下您可能需要 a.b = c.b ,也是为了不交叉连接两个 tables).

所以您的查询归结为:

select * 
from a
inner join b on b.a = a.a and b.b = a.b
inner join c on c.b = a.b;

如果以下是您的工作查询,那么我必须说它没有按预期进行。

select 
    * 
from
    A, B, C
where
    A.a (+)= B.a -- b left join a
    AND A.b (+) = B.b -- b left join a
    AND A.b = C.b; -- c inner join a

这只是三个表的内连接,因为最后一个条件使它成为a和c之间的内连接。只有在 a 和 c(以及 offcourse b)中都有可用数据时,它才会 return 数据。 (内连接)

要获得准确的结果,您只需要一个内部联接。

SELECT * FROM
B INNER JOIN A ON A.A=B.A AND A.B = B.B
INNER JOIN C ON A.B = C.B