存在查询Oracle连接语法与ANSI JOIN语法

t9aqgxwy  于 2023-03-29  发布在  Oracle
关注(0)|答案(2)|浏览(202)

当我像这样用ORACLE JOIN语法编写exist查询时,它可以像预期的那样正常工作。

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不同,因此,完整的查询不返回任何行。
Not:TableA中只有一行在TableB中没有引用。此查询应返回TableA中的一行。
为什么ANSI JOIN会这样?

tvmytwxo

tvmytwxo1#

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

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 )

干杯!

sqyvllje

sqyvllje2#

这两个查询根本不相似。
第一个是 correlated subqueryWHERE条件引用外部查询。
第二个是 * 不相关的子查询 *。与外部查询没有连接。在这种情况下,子查询返回单个值,独立于外部查询。如果它不返回行,则整体查询不返回行。如果它返回一行或多行,则整体查询返回多行。
两者都是有效的、正确的语法。您应该使用所需的语法,通常是相关的子查询。

相关问题