【发布时间】:2019-11-18 15:31:44
【问题描述】:
当我用这样的 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 不同,因此,完整的查询不返回任何行。
Not:TableA 上只有一行没有 TableB 上的引用。 此查询应返回 TableA 的一行。
为什么 ANSI JOIN 会这样?
【问题讨论】:
-
我想你很困惑。第一个是not
JOIN查询,因此它既不是 Oracle Join 也不是 ANSI JOIN。 -
在第二个查询中,您在
FROM中引用了两次TableA。使用别名来判断ON中的哪一个@ -
FROM 中的逗号表示交叉连接的优先级低于关键字 JOIN。您没有“使用 ORACLE JOIN 语法编写存在查询”,因为没有逗号/连接。为什么你认为你做到了?为什么你期望这些是等价的?除非您告诉我们为什么您期望它们的行为相同,否则我们无法解释为什么事情不会像您预期的那样运行。
-
@Serg 在子查询中重用 TableA 意味着某些东西&“使用别名”可以改变请求的内容,所以你不知道这是合适的。
-
我在想“where TableB.Id = TableA.TableBForeignKeyId”等于 INNER JOIN 表示法。这就是为什么我认为这些查询应该返回相同的结果。我注意到内部查询的 TableA 不是指外部 TableA,我通过为外部 TableA 提供别名来检查这一点,而不是在存在部分使用这个别名。如果我这样做,查询将按我的预期工作。但正如我所说,我的错误是在 someField = someOtherField 和 INNER JOIN 表示法上期望相同的结果。
标签: sql oracle inner-join exists ansi