Sql 如何替换外部连接

Sql 如何替换外部连接,sql,oracle,join,Sql,Oracle,Join,我有三张桌子。表A表B和表C它们分别以id1、id2、id3作为主键 id2在A和C中都是外键 id1是C中的外键 对于下面的查询,我们得到五行 select * from A where id3=123; 对于下面的查询,我们得到三行 select * from C where id3=123; 为了得到剩下的两行,我执行了如下的外部联接 select * from A,B,C whe

我有三张桌子。表A表B和表C它们分别以id1、id2、id3作为主键

id2在A和C中都是外键

id1是C中的外键

对于下面的查询,我们得到五行

     select * 
     from A 
     where id3=123;  
对于下面的查询,我们得到三行

     select * 
     from C 
     where id3=123;
为了得到剩下的两行,我执行了如下的外部联接

     select * 
     from A,B,C 
     where C.id3=123
     AND A.id1=C.id1(+)
我正在获得所需的输出


有没有更简单的方法,比如行内查询或使用“notexist”来替换外部联接?

您的语法将生成语法错误

我推测你想做这样的事情:

select a.*
from a left join
     c
     on a.id3 = c.id3 and a.id1 = c.id1
where a.id3 = 123;

然而,我不知道
B
在那里做什么;它在查询中,但不在问题的其他地方。

外部联接是实现所需功能的适当机制,但更标准的语法是:

select * 
from A
LEFT JOIN C 
    ON A.id1=C.id1
WHERE id3=123

为什么要替换外部联接?它非常普通、紧凑,应该和其他选项一样快。我会注意到,
OUTER JOIN
是一种首选语法,因为它是标准SQL,而Oracle的
(+)
符号不是-它只是为了向后兼容。内联查询将比这快得多,但我得到的是多行启动,结果正确,然后担心性能。内部联接给出了错误的结果,因此这不是一个选项。由于对C.id3的
where
子句引用,您的查询将只找到相同的三行。(我忽略了对B的虚假引用)。你到底想做什么?找到A中不在C中的两行?从A和C中获取数据,如果不匹配,C列将为null?还有别的吗?解释您正在做什么,使您的查询保持一致,并显示数据和预期结果。如果您确实有一些有效的方法,并且希望使用不同的方法来实现,请解释原因。我的错误是更新了问题我正在寻找的是替换我正在使用oracle的外部联接的方法sql@PravinKottawar . . . 这种语法已经被Oracle支持了十多年。先生,我正在寻找更简单的解决方案,如在线查询或使用not EXIST。我正在寻找的是替换外部联接的方法我正在使用Oracle sqlI我知道您的要求,但您没有给出替换它的好理由-它提供了正确的结果,是标准的、常见的,与其他能给出正确结果的技术相比,它不会对性能产生显著影响。@Pravinkotawar这就像要求使用
*
以外的东西进行乘法,因为
+
更快。