sql—在oracle查询中将连接从where子句移动到from子句

xam8gpfp  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(405)

我有下面的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;
wlzqhblo

wlzqhblo1#

在旧的oracle join语法中 (+) 将应用于外部联接表的所有列。因此,在原始查询中,表a外部联接到表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 ,以便不交叉连接两个表)。
所以你的问题可以归结为:

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

qco9c6ql2#

如果下面是你的工作查询,那么我必须说它没有做预期的事情。

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(以及非课程b)中都有可用数据时,它才会返回数据(内部连接)
为了得到准确的结果,只需要一个内部连接。

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

7hiiyaii3#

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

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

相关问题