当我使用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表现得如此?
答案 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);
条件是指外部查询。
第二个是不相关的子查询。没有与外部查询的连接。在这种情况下,子查询返回一个独立于外部查询的值。如果不返回任何行,则整个查询不返回任何行。如果返回一行或多行,则整个查询将返回多行。
两者都是有效的正确语法。您应该使用所需的那个,通常是相关的子查询。