2013-10-24 3 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 не имеют imp_id за столом vu_imp_list; WHERE's second condition будет извлекать только те записи, у которых есть корреспондент start_date и imp_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 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

+0

Именно это что я ищу. Я просто заменил 'AND (vil.start_date IS NULL' на' AND (vil.imp_id IS NULL), поскольку более старый путь будет включать самые старые 'start_date' ** и **' NULL', если есть – Hawk

Смежные вопросы