【问题标题】: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
);