2015-07-23 2 views
0

Как я могу выбрать никакие строки, если какая-либо строка в наборе результатов удовлетворяет определенному условию?Выберите «Нет строк», если любая строка соответствует условиям?

Например:

Id|SomeColumn|Indicator 
1 | test  | Y 
1 | test1 | Y 
1 | test2 | X 
2 | test1 | Y 
2 | test2 | Y 
3 | test1 | Y 

сказать, что я хотел, чтобы выбрать все строки, где Id = 1, если нет строки с индикатором = X

В настоящее время я делаю что-то вроде этого

SELECT * FROM SOMETABLE WHERE ID = 1 AND INDICATOR = 'Y' AND ID NOT IN (SELECT ID WHERE INDICATOR = 'X') 

Но это кажется очень неуклюжим, и я чувствую, что может быть лучший способ сделать это. Является ли я слишком чрезмерно чувствительным?

+2

Вы можете оставить 'INDICATOR = 'Y'' из' WHERE', но в остальном это нормально. –

ответ

2

Что-то вроде этого?

SELECT * 
FROM SOMETABLE 
WHERE ID = 1 
AND NOT EXISTS (SELECT 1 FROM SOMETABLE WHERE INDICATOR = 'X') 

или, если вы хотите X различать только на том же идентификатору:

SELECT * 
FROM SOMETABLE t1 
WHERE t1.ID = 1 
AND NOT EXISTS (SELECT 1 FROM SOMETABLE t2 WHERE t1.ID = t1.ID AND INDICATOR = 'X') 
+0

Мне нравится NOT EXISTS, это может быть синтаксический сахар, но он выглядит намного чище – Pseudonym

1

Там не слишком много вариантов, чтобы сделать это. Другой вариант - использовать EXISTS.

SELECT * 
FROM SOMETABLE s1 
WHERE ID = 1 AND INDICATOR = 'Y' 
    AND NOT EXISTS (SELECT TOP 1 ID FROM SOMETABLE s2 WHERE s1.ID = s2.ID AND INDICATOR = 'X') 
1

Другой вариант, если в колонке индикатора имеется принудительный порядок.

DECLARE @T TABLE 
    (
     ID INT 
    , someColumn VARCHAR(5) 
    , Indicator CHAR(1) 
    ) 
INSERT INTO @T 
     (ID, someColumn, Indicator) 
VALUES (1, 'test', 'Y'), 
     (1, 'test1', 'Y'), 
     (1, 'test2', 'X'), 
     (2, 'test1', 'Y'), 
     (2, 'test2', 'Y'), 
     (3, 'test1', 'Y') 

SELECT t.ID 
     , t.someColumn 
     , t.Indicator 
FROM @T t 
    JOIN (SELECT ID 
      FROM @T t2 
      GROUP BY t2.ID 
      HAVING MIN(indicator) >= 'Y') q ON q.ID = t.ID 

Не уверен, если это какой-нибудь менее неуклюжим, но он может работать лучше, так как он использует положительное исключение, а не отрицательным.

Смежные вопросы