2013-10-24 28 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