2014-10-16 32 views
-2

我剛剛離開學校,剛剛開始在工作中使用Oracle SQL開發人員。我在這個特定查詢中的目標是獲取已經休眠或不活躍的帳號。我遇到的問題是,其中一些帳戶有活躍的貸款,所以我想從結果中排除這些特定帳戶。我試圖使用Exists子句來實現這一點,但結果仍然包含這些帳戶。這是我正在使用的連接:在JOIN中使用EXISTS

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

該查詢還有兩個其他內部連接以及其之前的其他條件和其他條件。除了Exists子句之外,一切都正常。

+2

它是如何「不起作用」? – 2014-10-16 14:41:25

回答

0

我通常使用「反連接」模式來查找在另一個表中沒有對應記錄的記錄。

你的情況:

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

請注意,因爲你正在做一個左連接,ALN.ACCTNBRNULL對於沒有任何匹配的記錄在ALN所有帳戶。

0

您從錯誤的(外部)ACCT距離表條目中選擇。添加別名所有你的表引用會解決這個問題:

... 
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 
    ); 

這仍然是沒有意義的。也許你只想要NOT EXISTS()

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