【问题标题】:Ignore WHERE condition if record not found如果未找到记录,则忽略 WHERE 条件
【发布时间】:2013-10-24 11:45:46
【问题描述】:

我编写了以下脚本:

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) 

这将为每个account_id 返回最旧的imp_id。但是,它将忽略那些没有imp_id 的。由于某些account_ids 在餐桌上没有imp_id vu_imp_listWHERE's second condition 将仅提取具有对应 start_dateimp_id 的那些记录。简而言之,如果在表vu_imp_list 中找不到相应记录,如何忽略此条件。我找到了与 MySQL 相关的 this post,但似乎有问题,因为我不断收到错误 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)

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    如果我对您的理解正确,您需要的是一个LEFT JOIN,当加入ACCOUNT 表和VU_IMP_LIST 并在WHERE 子句中更改您的条件以检查start_date 是否是NULL(没有对应的记录在VU_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

    【讨论】:

    • 没错,这就是我要找的。我刚刚将AND (vil.start_date IS NULL 替换为AND (vil.imp_id IS NULL,因为旧方式将包括最旧的start_date NULL(如果有)
    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2014-03-08
    • 2016-07-26
    • 2023-03-06
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多