2010-10-22 59 views
3

我在Oracle數據庫中有兩個表(A和G),可以根據帳號連接在一起。有一點需要注意的是,其中一個表(G)比另一個少了大約80個記錄。當我一起查詢這兩個表時,我需要獲取所有行,以便我們可以在列中看到缺少80行的NULL數據。如何在Oracle中轉換「遺留」左外部聯接語句?

我目前有執行左外使用下面的「遺產」語法連接查詢一個Oracle聲明:

SELECT A.AccountNo, 
     A.ParcelNo, 
     A.LocalNo, 
     A.PrimaryUseCode, 
     A.DefaultTaxDistrict, 
     RTRIM(G.Section), 
     RTRIM(G.Township), 
     RTRIM(g.Range) 

    FROM tblAcct A, tblAcctLegalLocation G 

WHERE A.verstart <= '20100917999' AND A.verend > '20100917999' AND A.DefaultTaxDistrict = '2291' 
     AND (SUBSTR(A.AccountNo,1,1) = 'R' or SUBSTR(A.AccountNo,1,1)= 'I') 
     AND SUBSTR(a.ParcelNo,1,1)<> '7' and substr(a.ParcelNo,1,1)<>'8' 
     AND A.AcctStatusCode IN ('A', 'T', 'E') 
     AND A.AccountNo = G.AccountNo(+) 
     AND G.verstart(+) <= '20100917999' and G.verend(+) > '20100917999' 
ORDER BY A.ParcelNo, A.LocalNo 

我想這個查詢轉換成「標準」 LEFT JOIN類型的查詢,因爲我被告知新版本的Oracle支持這種語法。我試過基本的

LEFT OUTER JOIN ON A.AccountNo = G.AccountNo 

但這似乎並不奏效。我的查詢返回比全額少80行。

任何人都可以告訴我我缺少什麼或如何正確格式化查詢嗎?

回答

7

使用:你看到標有(+)

SELECT a.AccountNo, 
     a.ParcelNo, 
     a.LocalNo, 
     a.PrimaryUseCode, 
     a.DefaultTaxDistrict, 
     TRIM(g.Section), 
     TRIM(g.Township), 
     TRIM(g.Range) 
    FROM tblAcct A 
LEFT JOIN tblAcctLegalLocation g ON g.accountno = a.accountno 
           AND g.verstart <= '20100917999' 
           AND g.verend > '20100917999' 
    WHERE a.verstart <= '20100917999' 
     AND a.verend > '20100917999' 
     AND a.DefaultTaxDistrict = '2291' 
     AND SUBSTR(a.AccountNo,1,1) IN ('R', 'I') 
     AND SUBSTR(a.ParcelNo,1,1) NOT IN ('7', '8') 
     AND a.AcctStatusCode IN ('A', 'T', 'E') 
ORDER BY a.ParcelNo, a.LocalNo 

一切都必須包含在外部連接標準。在外部JOIN中,標準在連接之前應用。

+0

非常好!像魅力一樣工作。你可以擴展一點「...在外部聯接中,標準在聯接之前應用。」我試圖把我的頭圍繞一點,並向我的同事解釋。 – 2010-10-22 21:59:14

+1

@ Dillie-O:在這個例子中,'* verstart'和'verend'標準在* JOIN之前被應用*。它就像一個派生表,在建立JOIN之前過濾掉信息 - 這將產生與在WHERE子句中指定標準不同的結果。 – 2010-10-22 22:01:29

+0

啊,我現在明白了。謝謝! – 2010-10-22 22:02:39