[英]SQL transforming from (+)= query to left outer join
轉換前查詢
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;
對於為何“查詢后”轉換為什么不返回與之前查詢相同的結果,我似乎有些猶豫。 我知道我在這里錯過了一些愚蠢的東西,誰能發現明顯的東西?
原始查詢僅包含一個外部聯接,因為沒有在相關表的所有條件上都使用(+)
。
因此,使用較新的連接語法的正確重寫是:
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;
嘗試:
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
(因此(+)
的加入域)。
看到這個 。
原因可能是修改后的查詢引用了名為z.corp_seq
和h.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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.