2013-04-01 2 views
0

Я сохраню это просто: я хотел бы знать, есть ли хороший способ выбрать все значения в столбце, когда он никогда не имеет нуля в другом столбце. Например.SQL (TSQL) - Выберите значения в столбце, где другой столбец не равен нулю?

A  B 
----- ----- 

    1  7 
    2  7 
NULL  7 
    4  9 
    1  9 
    2  9 

Из приведенного выше набора я просто хочу, 9 из B, а не 7, потому что 7 имеет значение NULL в А. Очевидно, что я мог бы обернуть это в качестве подзапроса и использовать предложение IN и т.д., но это уже часть довольно уникальный набор, и я хочу сохранить его эффективным.

Я хотел бы отметить, что для моих целей это было бы только сравнение односторонний ... Я бы возвращение значения только в B и исследованием A.

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

ответ

1

Вы можете сделать что-то вроде этого:

select * 
from t 
where t.b not in (select b from t where a is null); 

Если вы хотите только определенные б значения, то вы можете сделать:

select b 
from t 
group by b 
having sum(case when a is null then 1 else 0 end) = 0; 

И, наконец, вы можете использовать окно функции:

select a, b 
from (select t.*, 
      sum(case when a is null then 1 else 0 end) over (partition by b) as NullCnt 
     from t 
    ) t 
where NullCnt = 0; 
+0

Этот второй пример хорошо работает для моей цели! Я должен отметить, что все это является частью предотвращения реляционного деления. –

1

В нижеследующем запросе будет выводиться только один столбец в конечном результате. Записи сгруппированы по столбцу B и проверьте, соответствует ли запись null или нет. Когда запись равна null, значение для группы будет увеличиваться каждый раз на 1. Предложение HAVING фильтрует только группу, которая имеет значение 0.

SELECT B 
FROM TableName 
GROUP BY B 
HAVING SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0 

Если вы хотите получить все строки из записей, вы можете использовать join.

SELECT a.* 
FROM TableName a 
     INNER JOIN 
     (
      SELECT B 
      FROM TableName 
      GROUP BY B 
      HAVING SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0 
     ) b ON a.b = b.b 
Смежные вопросы