【问题标题】:Exist query Oracle join syntax vs ANSI JOIN syntax现有查询 Oracle 连接语法与 ANSI JOIN 语法
【发布时间】: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


【解决方案1】:

这两个查询根本不相似。

第一个是相关子查询WHERE 条件引用外部查询。

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

两者都是有效、正确的语法。您应该使用您想要的,通常是相关子查询。

【讨论】:

    【解决方案2】:

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

    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 )
    

    干杯!!

    【讨论】:

    • 感谢您的评论,我知道内部查询的TableA不会引用外部TableA。但我期待相反的结果。这就是我问这个问题的原因,为什么它不引用外部 TableA
    • 因为在EXISTS中,如果你想引用outer table那么你可以直接使用别名。 EXISTS 处理外部表的每条记录。参考 EXISTS 的好例子:Link
    • 我也知道,但我在第一个查询中没有使用别名,并且表 A 的行为类似于外部表 A。但它不在内部连接查询中
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2013-02-13
    • 2012-07-29
    • 2010-11-15
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多