2012-12-20 27 views
1

查詢SQL從(+)=查詢轉換到左改造前外連接

SELECT w.tech AS tech, 
     w.wpcddate AS job_date, 
     w.corp AS corp, 
     w.house AS house_number, 
     w.cust AS cust_number, 
     h.zipcode AS zipcode 
    FROM fsm_m_wipmaster w, 
     fsm_m_zipmaster z, 
     fsm_m_housemaster h, 
     fsm_m_custmaster c 
WHERE c.corp(+) = w.corp 
    AND c.house(+) = w.house 
    AND c.cust(+) = w.cust 
    AND h.corp(+) = w.corp 
    AND h.house(+) = w.house 
    AND h.cust(+) = w.cust 
    AND z.corp(+) = w.corp 
    AND z.zipbeg IS NULL 
    AND h.zipcode IS NOT NULL 
    AND w.tech IS NOT NULL 
ORDER BY w.corp; 

查詢轉換後

SELECT w.tech AS tech, 
     w.wpcddate AS job_date, 
     w.corp AS corp, 
     w.house AS house_number, 
     w.cust AS cust_number, 
     h.zipcode AS zipcode 
    FROM fsm_m_housemaster h 
     LEFT OUTER JOIN 
     fsm_m_custmaster c 
     ON h.cust = c.cust 
    AND h.corp_seq = c.corp_seq 
    AND h.house = c.house 
     LEFT OUTER JOIN 
     fsm_m_wipmaster w 
     ON h.cust = w.cust 
    AND h.house = w.house 
    AND h.corp_seq = w.corp_seq 
     LEFT OUTER JOIN fsm_m_zipmaster z 
     ON h.corp_seq = z.corp_seq AND z.zipbeg IS NULL 
WHERE w.tech IS NOT NULL 
ORDER BY w.corp; 

我似乎打破我的頭,爲什麼查詢轉換之後沒有返回與之前查詢相同的結果。 我知道我在這裏丟失了一些愚蠢的東西 任何人都可以發現明顯的?

+0

這不是一個問題... – Neal

+1

條件'z.zipbeg是null','h.zipcode不null'和' w.tech IS NOT NULL'不要使用'(+)'語法,因此它們不能成爲ON子句的一部分,但必須留在WHERE子句中。如果我沒有弄錯,他們使用'(+)'語法在原始查詢中沒有任何影響,因爲這些相同的條件會將外連接變成內連接。所以看起來像一個外連接一直是內連接。 – Codo

+0

@codo這是有道理的 – Sudhakar

回答

4

原始查詢只包含單個外連接,因爲(+)尚未用於相關表的所有條件。

因此,使用較新的連接語法正確改寫爲:

SELECT w.tech AS tech, 
    w.wpcddate AS job_date, 
    w.corp AS corp, 
    w.house AS house_number, 
    w.cust AS cust_number, 
    h.zipcode as zipcode 
FROM fsm_m_wipmaster w 
JOIN fsm_m_zipmaster z ON z.corp = w.corp AND z.zipbeg is null 
JOIN fsm_m_housemaster h ON h.corp = w.corp AND h.house = w.house AND h.cust = w.cust AND h.zipcode is not null 
LEFT OUTER JOIN fsm_m_custmaster c ON c.corp = w.corp AND c.house = w.house AND c.cust = w.cust 
WHERE w.tech IS NOT NULL 
ORDER BY w.corp; 
2

嘗試:

SELECT w.tech AS tech, 
    w.wpcddate AS job_date, 
    w.corp AS corp, 
    w.house AS house_number, 
    w.cust AS cust_number, 
    h.zipcode as zipcode 
FROM fsm_m_wipmaster w 
LEFT OUTER JOIN fsm_m_zipmaster z ON w.corp = z.corp 
LEFT OUTER JOIN fsm_m_housemaster h ON w.corp = h.corp AND w.house = h.house AND w.cust = h.cust 
LEFT OUTER JOIN fsm_m_custmaster c ON w.corp = c.corp AND w.house = c.house AND w.cust = c.cust 
WHERE w.tech IS NOT NULL 
AND z.zipbeg IS NULL 
AND h.zipcode IS NOT NULL 
ORDER BY w.corp; 

看來你倒JOINs:在第一個查詢,它的fsm_m_wipmaster表這是對LEFT OUTER JOIN(因此(+)上連接字段)的左側。

請參閱this

1

一個原因可能是,修訂後的查詢引用了一個名爲z.corp_seqh.corp_seq場,但原來的查詢並不:

left outer join fsm_m_zipmaster z on h.corp_seq = z.corp_seq and z.zipbeg is null 

試試這個:

left outer join fsm_m_zipmaster z on h.corp = z.corp and z.zipbeg is null