当我像这样用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会这样?
2条答案
按热度按时间tvmytwxo1#
您在第一个查询中编写的语法很好:即
在第二个查询中,内部查询的TableA将不会引用外部TableA,因此您不会获得所需的结果。
如果您正在寻找编写查询的其他方法,则可以使用以下查询:
干杯!
sqyvllje2#
这两个查询根本不相似。
第一个是 correlated subquery。
WHERE
条件引用外部查询。第二个是 * 不相关的子查询 *。与外部查询没有连接。在这种情况下,子查询返回单个值,独立于外部查询。如果它不返回行,则整体查询不返回行。如果它返回一行或多行,则整体查询返回多行。
两者都是有效的、正确的语法。您应该使用所需的语法,通常是相关的子查询。