2013-10-24 26 views
0

我寫了下面的腳本記錄:忽略WHERE條件,如果沒有找到

SELECT vil.account_id , 
     vil.imp_id, 
     vil.owner , 
     vil.start_date, 
     CASE 
     WHEN ac.status = 4 
     THEN status_date 
     ELSE NULL 
     END AS Live_date, 
     cs.country_code 
    FROM ACCOUNT ac 
    INNER JOIN vu_imp_list vil 
    ON vil.account_id = ac.account_id 
    INNER JOIN entity e 
    ON ac.entity_id = e.entity_id 
    INNER JOIN country_specifics cs 
    ON e.country_id = cs.country_id 
WHERE ac.account_id IN 
('000206789', '000207464', '000207696', '000207746') 
AND 
(vil.start_date = 
(SELECT MIN(vils.start_date) 
FROM vu_imp_list vils 
WHERE vil.account_id = vils.account_id) 

這將返回最早imp_id每個account_id。但是,它會忽略那些沒有imp_id的。由於某些account_ids在表vu_imp_list處沒有imp_id; WHERE's second condition只會提取那些記錄有start_dateimp_id的記錄。總之,如果在表vu_imp_list中找不到相應的記錄,如何忽略這種情況。我發現this post爲MySQL相關的,但似乎什麼不對的地方,因爲我不斷收到錯誤missing SELECT keyword

SELECT vil.account_id , 
     vil.imp_id, 
     vil.owner , 
     vil.start_date, 
     CASE 
     WHEN ac.status = 4 
     THEN status_date 
     ELSE NULL 
     END AS Live_date, 
     cs.country_code 
    FROM ACCOUNT ac 
    INNER JOIN vu_imp_list vil 
    ON vil.account_id = ac.account_id 
    INNER JOIN entity e 
    ON ac.entity_id = e.entity_id 
    INNER JOIN country_specifics cs 
    ON e.country_id = cs.country_id 
WHERE ac.account_id IN 
('000206789', '000207464', '000207696', '000207746') 
AND 
((vil.start_date = 
(SELECT MIN(vils.start_date) 
FROM vu_imp_list vils 
WHERE vil.account_id = vils.account_id)) 
OR 
NOT EXISTS 
(vil.start_date = (SELECT MIN(vils.start_date) 
FROM obi.vu_implementation_list vils 
WHERE vil.ob10_account_id = vils.ob10_account_id) 

回答

1

如果我理解正確的,你需要的是一個LEFT JOINVU_IMP_LIST加入ACCOUNT表和改變你的條件WHERE時子句來檢查start_date是否爲NULLVU_IMP_LIST找不到相應記錄)OR它等於從標量子查詢返回的值。使用LEFT JOIN,從ACCOUNT表中的所有記錄將被退回,即使在VU_IMP_LIST表中沒有相應的記錄:

SELECT vil.account_id , vil.imp_id, vil.owner , vil.start_date, 
     CASE 
     WHEN ac.status = 4 THEN status_date 
     ELSE NULL 
     END AS Live_date, cs.country_code 
    FROM ACCOUNT ac 
    LEFT JOIN vu_imp_list vil ON vil.account_id = ac.account_id 
    INNER JOIN entity e ON ac.entity_id = e.entity_id 
    INNER JOIN country_specifics cs ON e.country_id = cs.country_id 
WHERE ac.account_id IN ('000206789', '000207464', '000207696', '000207746') 
    AND (vil.start_date IS NULL 
     OR vil.start_date = (SELECT MIN(vils.start_date) 
           FROM vu_imp_list vils 
          WHERE vil.account_id = vils.account_id)) 
; 

你可以閱讀更多有關不同類型的連接位置:About SQL Joins

+0

沒錯,這是我在找什麼。我剛剛用'AND(vil.imp_id IS NULL')替換了'AND(vil.start_date IS NULL',因爲如果有的話,舊的方法將包括最老的'start_date' **和**'NULL' – Hawk