2012-03-06 2 views
0

У меня есть сложный запрос, но вот суть того, что я пытаюсь сделатьКак использовать WHERE заявление в SQL, чтобы исключить группу

В таблице вида:

 
Col1 Col2 
Bill 0 
Bill 0 
Bill 0 
Bill 1 
Bill 1 
John 1 
John 1 
Jonh 1 

В приведенной выше таблице указаны 2 столбца. Я пытаюсь запросить строки, которые имеют «1» во всех строках в столбце 2. Поскольку строки «Билл» с «0» и «1», счет должен быть исключен. Подзапрос в выражении WHERE дает более одного результата и не работает.

SELECT t1.Col1 
FROM Table1 t1 
WHERE t1.Col1 <> (SELECT t1.Col1 FROM Table1 t1 WHERE t1.Col2 <> '0') 

Используя форму оператора цикла в запросе будет принести новый уровень головной боли моего проекта, так что я надеюсь, что любой умный человек может помочь мне в моих поисках.

+0

Чтобы уточнить, из приведенных выше данных образца должен быть возвращен запрос «Джон» или ничего? – GarethD

ответ

3

Существует несколько подходов. Каждый из них имеет свои достоинства в зависимости от вашей РСУБД и того, что вы считаете самым легким для чтения. См. here для получения дополнительной информации о производительности и проверки планов выполнения или проведения некоторых тестов для получения решения, которое наилучшим образом соответствует вашим потребностям.

SELECT * 
FROM Table t1 
WHERE t1.Col1 NOT IN (SELECT t1.Col1 FROM Table1 t1 WHERE t1.Col2 <> '0') 

или

SELECT t1.* 
FROM Table t1 
     LEFT JOIN 
     ( SELECT Col1 
      FROM Table 
      WHERE Col2 <> '0' 
     ) Exc 
      ON exc.Col1 = t1.Col1 
WHERE Exc.Col1 IS NULL 

или

SELECT * 
FROM Table t1 
WHERE NOT EXISTS 
     ( SELECT 1 
      FROM Table t2 
      WHERE t2.Col2 <> '0' 
      AND  t1.Col1 = t2.Col1 
     ) 
+0

Так что замена «<>» на «NOT IN» имеет значение? Я очень хочу попробовать это! – Sweetspot

3
SELECT t1.Col1 
FROM Table1 t1 
WHERE NOT EXISTS 
(SELECT t2.Col1 
FROM Table1 t2 
WHERE t2.col2 = 0 
AND t2.col1 = t1.col1) 
+0

Сравнение вложенного запроса с основным запросом? Ницца! Но будут ли они экспоненциально использовать ресурсы при использовании в более сложных запросах? – Sweetspot

+0

Хорошее место для ознакомления с последствиями существует здесь: http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/ – Dibstar

0
SELECT Col1 
    FROM YourTable 
WHERE Col2 = 1 
EXCEPT 
SELECT Col1 
    FROM YourTable 
WHERE Col2 <> 1; 
+0

Thankyou! Это все решило! – Sweetspot

0

Try:

SELECT Col1 
FROM Table1 
GROUP BY Col1 
HAVING COUNT(DISTINCT Col2)=1 and MAX(Col2)='1' 
+0

Я не думаю, что это сработает правильно, хотя запрос OP не соответствует его вопросу, поэтому трудно сказать для определенного. Если бы была другая строка, например col1 = 'foo', col2 = 0. Ваш запрос возвращал бы как John, так и Foo, тогда как на основании вопроса он должен был возвращать только John, и на основании запроса в вопросе он должен только возвращать Foo. Я думаю, вам понадобится 'HAVING COUNT (CASE WHEN Col2! = '0' THEN 1 END) = 0' вместо' HAVING COUNT (DISTINCT Col2) = 1. Или вы можете использовать 'HAVING COUNT (Col2) = COUNT (CASE WHEN Col2 = '0' THEN 1 END) ' – GarethD

+0

К сожалению, я пропустил требование возвращать только Col2 = '1' (вместо какого-либо одного значения). Запрос обновляется соответствующим образом. –

+0

Не возвращать Col2 = '1', но исключить Билл и только вернуть Джона, потому что некоторые из Col2 Билла имеют значение '0'. – Sweetspot

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