【问题标题】:Use EXISTS in a JOIN在 JOIN 中使用 EXISTS
【发布时间】:2014-12-11 23:34:18
【问题描述】:

我刚从学校毕业,刚开始在工作中使用 Oracle SQL 开发人员。我在这个特定查询中的目标是获取已休眠或不活动的帐号。我遇到的问题是其中一些账户有活跃的贷款,所以我想从结果中排除这些特定账户。我正在尝试使用 Exists 子句来完成此操作,但结果仍将包括这些帐户。这是我正在使用的加入:

LEFT JOIN ACCTLOAN ALN ON ACCT.ACCTNBR = ALN.ACCTNBR AND NOT EXISTS (SELECT ALN.ACCTNBR FROM ACCT
          WHERE ALN.ACCTNBR = ACCT.ACCTNBR)

查询之前有两个其他内部连接,下面还有其他条件。除 Exists 子句外,一切正常。

【问题讨论】:

  • 它是如何“不工作”的?

标签: sql oracle exists not-exists


【解决方案1】:

我通常使用“反连接”模式来查找在另一个表中没有对应记录的记录。

在你的情况下:

LEFT JOIN ACCTLOAN ALN ON ACCT.ACCTNBR = ALN.ACCTNBR AND ALN.ACCTNBR IS NULL

请注意,由于您正在执行左连接,对于在 ALN 中没有任何匹配记录的所有帐户,ALN.ACCTNBR 将是 NULL

【讨论】:

    【解决方案2】:

    您从错误的(外部)ACCT 范围表条目中进行选择。将别名添加到 all 您的表引用将解决此问题:

    ...
    FROM ACCT A
    LEFT JOIN ACCTLOAN ALN ON A.ACCTNBR = ALN.ACCTNBR 
        AND NOT EXISTS (SELECT 1
              FROM ACCT X
              WHERE ALN.ACCTNBR = X.ACCTNBR
        );  
    

    这仍然没有意义。也许你只想要 plain NOT EXISTS()

     ...
    FROM ACCT A
    WHERE NOT EXISTS (SELECT 1
        FROM ACCTLOAN X
        WHERE X.ACCTNBR = A.ACCTNBR
        );  
    

    【讨论】:

      猜你喜欢
      • 2011-10-28
      • 2021-10-30
      • 2021-04-21
      • 2015-12-24
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2015-10-07
      相关资源
      最近更新 更多