簡體   English   中英

SQL從(+)=查詢轉換為左外部聯接

[英]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_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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM