#sql #oracle #select
#sql #Oracle #выберите
Вопрос:
Здесь я хочу выбрать enames
запись, для которой значение date
равно нулю, как для событий 37, так и для 49, а также для имен, для которых эти два события (37,49) не связаны. Если date
для любого события не равно null, то оно не должно выбирать это ename
. Здесь, в этом примере, он должен получать только C1, D1, E1 ename . D1 и E1, потому что не связано с событиями № 37 и 49
Может кто-нибудь, пожалуйста, помочь мне с этим.
id ename event date
1 A1 37 1-Oct-16
2 A1 49 NULL
3 C1 37 NULL
4 C1 49 NULL
5 D1 50 NULL
6 E1 30 NULL
Только что добавлено еще одно условие. Пожалуйста
Комментарии:
1. Может ли событие иметь значения, отличные от 37, 49? Если да, то что, если для ename есть одна строка с датой, отличной от null, и событием, отличным от 37, 49?
Ответ №1:
Подсчитайте соответствующие строки. Если требуется только ename
select ename
from mytable
where event in (37,49) and date is null
group by ename
having count(*) = 2
Редактировать
Следуя новому набору условий
select distinct ename
from mytable t1
where not exists (
select 1
from mytable t2
where t2.ename = t1.ename and t2.event in (37,49) and t2.date is not NULL)
;
Комментарии:
1. Только что добавлено еще одно условие. Не могли бы вы проверить это еще раз
2. Может ли новый набор условий быть обобщен как «не существует строки с событиями (37 или 49), где дата не равна нулю»?
Ответ №2:
Изменение запроса при условии, что ваши данные не содержат повторяющихся строк:
SELECT *
FROM table_name
WHERE event IN ( 37, 49 )
AND ename NOT IN(SELECT DISTINCT( ename )
FROM table_name
WHERE date IS NOT NULL)
UNION
SELECT *
FROM table_name
WHERE event NOT IN ( 37, 49 )
AND ename NOT IN(SELECT DISTINCT( ename )
FROM table_name
WHERE date IS NOT NULL);
Комментарии:
1. Мне также нужны имена, которые не связаны с событием (37 и 39), т.е. D1, E1
Ответ №3:
SELECT
ename
FROM
TableName
GROUP BY
ename
HAVING
COUNT(CASE WHEN event IN (37,49) AND date IS NOT NULL THEN 1 END) = 0
Ответ NOT EXISTS
in @Serg — отличный способ, но вы также можете использовать условную агрегацию, чтобы сделать это без вложенного запроса. При использовании формулы агрегирования, такой как COUNT()
или SUM()
, они игнорируют Null
значения, поэтому, если ELSE
часть вашего CASE
выражения NULL
равна, она будет игнорироваться и по умолчанию ELSE
NULL
равна, если она не определена.