oracle sql - выберите ТОЛЬКО если в этом столбце НЕТ пустых значений

Я смотрю на контрольный список, который содержит несколько уникальных пунктов контрольного списка. Я только хочу выбрать записи (ID, имя и т. Д.) Из тех, которые не имеют нулевых значений в поле даты контрольного списка.

Select distinct sp.id as "ID",
                SP.LAST_NAME as "Last",
                SP.FIRST_NAME as "First",
                SA.TERM_CODE_ENTRY as "Term", 
                SA.APST_CODE as "Status"
FROM SPRITE SP
JOIN SARC CK
    on sp.sprite_pidm = CK.SARC_pidm 
JOIN ADAP SA
    on sp.sprite_pidm = sa.adap_PIDM
WHERE
    Sp.sprite_change_ind is null
and SA.ADAP_TERM_CODE_ENTRY = '201480'
and SA.ADAP_APST_CODE = 'I'
and SA.ADAP_APPL_NO  = CK.SARC_APPL_NO
-- where there are no null records - all records should be not null
and CK.SARC_RECEIVE_DATE is not null

В настоящее время выбираются те, у кого есть хотя бы одна не пустая дата контрольного списка. Это означает, что он по-прежнему выбирает записи тех, у кого есть нулевые даты для некоторых пунктов контрольного списка.

Как сказать ему выбрать где CK.SARC_RECEIVE_DATE = (все элементы контрольного списка receive_dates должны быть ненулевыми значениями)?

Упрощенный пример:

ID    Name    Checklist Items    DateReceived       Other data...
01    Sherry  missing item 1     
01    Sherry  missing item 2     02-02-14
05    Mike    missing item 8     02-03-13
17    Carl    missing item 2     
17    Carl    missing item 3     
28    Luke    missing item 3     04-03-13    
28    Luke    missing item 5     04-03-13
28    Luke    missing item 8     04-03-13

The results should be
05    Mike (other data...)
28    Luke (other data...)

Instead, it is returning
01    Sherry (other data...)
05    Mike   (other data...)
28    Luke   (other data...)

3 ответа

Решение
WITH MYVIEW AS
(
    Select   sp.id as ID,
             SP.LAST_NAME ,
             SP.FIRST_NAME,
             SA.TERM_CODE_ENTRY, 
             SA.APST_CODE,
             CK.SARC_RECEIVE_DATE As RECEIVED_DATE
    FROM SPRITE SP
    JOIN SARC CK
        on sp.sprite_pidm = CK.SARC_pidm 
    JOIN ADAP SA
        on sp.sprite_pidm = sa.adap_PIDM
    WHERE
        Sp.sprite_change_ind is null
    and SA.ADAP_TERM_CODE_ENTRY = '201480'
    and SA.ADAP_APST_CODE = 'I'
    and SA.ADAP_APPL_NO  = CK.SARC_APPL_NO
)
SELECT ID as "ID",
       MAX(LAST_NAME) as "Last",
       MAX(FIRST_NAME) as "First",
       MAX(TERM_CODE_ENTRY) as "Term",
       MAX(APST_CODE) as "Status"
 FROM MY_VIEW
GROUP BY id 
HAVING SUM(NVL2(RECEIVED_DATE,0,1)) = 0;

Ты бы так не поступил. Вместо этого используйте аналитическую функцию, чтобы посчитать количество значений NULL и выбрать те, которые не имеют никаких. Вот идея:

with t as (
      <your query here>
     )
select *
from (select t.*, sum(case when SARC_RECEIVE_DATE is null then 1 else 0 end) as numNulls
      from t
     ) t
where numNulls = 0;

Я отвечаю на основе приведенного вами примера.

Ты можешь использовать NOT EXISTS также, так как вы не выбираете из таблицы SARC,

/*
WITH sprite AS (SELECT 1 sprite_id, 'Sherry' Name FROM dual
                UNION ALL SELECT 5, 'Mike' FROM dual
                UNION ALL SELECT 17, 'Carl' FROM dual
                UNION ALL SELECT 28, 'Luke' FROM dual),
sarc AS (
    SELECT 1 sprite_id, 'missing item' checklist, 1 items, null AS dateReceived FROM dual
    UNION ALL SELECT 1, 'missing item', 2, to_date('02-02-2014', 'dd-mm-yyyy') FROM dual
    UNION ALL SELECT 5, 'missing item', 8, to_date('02-03-2014', 'dd-mm-yyyy') FROM dual
    UNION ALL SELECT 17, 'missing item', 2, null FROM dual
    UNION ALL SELECT 17, 'missing item', 3, null FROM dual
    UNION ALL SELECT 28, 'missing item', 3, to_date('04-03-2014', 'dd-mm-yyyy') FROM dual
    UNION ALL SELECT 28, 'missing item', 5, to_date('04-03-2014', 'dd-mm-yyyy') FROM dual
    UNION ALL SELECT 28, 'missing item', 8, to_date('04-03-2014', 'dd-mm-yyyy') FROM dual)
-- */
SELECT distinct sp.sprite_id, sp.name
  FROM sprite sp
 WHERE NOT EXISTS (SELECT 1
                     FROM sarc sa
                    WHERE sa.sprite_id = sp.sprite_id
                          AND dateReceived IS NULL);

Результат именно так, как вы хотите.

Я думаю, что следующая модификация вашего запроса должна работать для вас. Я не уверен в точных результатах, так как я не знаю ваши данные примера, но это должно работать с небольшой модификацией:

SELECT DISTINCT sp.id AS "ID",
                SP.LAST_NAME AS "Last",
                SP.FIRST_NAME AS "First",
                SA.TERM_CODE_ENTRY AS "Term",
                SA.APST_CODE AS "Status"
  FROM SPRITE SP
       JOIN ADAP SA ON sp.sprite_pidm = sa.adap_PIDM
 WHERE     Sp.sprite_change_ind IS NULL
       AND SA.ADAP_TERM_CODE_ENTRY = '201480'
       AND SA.ADAP_APST_CODE = 'I'
       AND NOT EXISTS (SELECT 1
                         FROM sarc ck
                        WHERE     ck.sarc_appl_no = sa.adap_appl_no
                              AND ck.sarc_receive_date IS NULL);
Другие вопросы по тегам