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);