Oracle выбирает запись с условием нескольких столбцов

#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 равна, если она не определена.