现有查询Oracle连接语法与ANSI JOIN语法

时间:2019-07-09 06:22:08

标签: sql oracle inner-join exists ansi

当我使用ORACLE JOIN语法编写这样的存在查询时,它可以按预期工作。

Select * from TableA
where not exists (Select 1 from TableB where TableB.Id = TableA.TableBForeignKeyId)

当我以ANSI JOIN语法编写它时,它不起作用。

Select * from TableA
where not exists (Select 1 
                      from (TableA 
                            INNER JOIN TableB 
                            on TableA.TableBForeignKeyId = TableB.Id))

在ANSI JOIN版本上,TableA的行为不同于上部查询TableA,因此,完整查询不返回任何行。

  

否:TableA上只有一行,而TableB上没有引用。   该查询应返回TableA的一行。

为什么ANSI JOIN表现得如此?

2 个答案:

答案 0 :(得分:0)

您在第一个查询中编写的语法很好:

Select * from TableA
where not exists (Select 1 from TableB where TableB.Id = TableA.TableBForeignKeyId)

在第二个查询中,内部查询的TableA不会引用外部TableA,因此您不会获得所需的结果。

  • 为什么您对第一个查询不满意?

如果您正在寻找编写查询的其他方式,则可以使用以下查询:

Select * from TableA
where TableA.TableBForeignKeyId not in (Select TableB.Id 
                      from TableB )

干杯!

答案 1 :(得分:0)

这两个查询根本不相似。

第一个是相关子查询js.executeScript("arguments[0].setAttribute('style', 'color: blue; border: 2px solid Magenta;');", last_name); 条件是指外部查询。

第二个是不相关的子查询。没有与外部查询的连接。在这种情况下,子查询返回一个独立于外部查询的值。如果不返回任何行,则整个查询不返回任何行。如果返回一行或多行,则整个查询将返回多行。

两者都是有效的正确语法。您应该使用所需的那个,通常是相关的子查询。