2012-03-06 3 views
0

그룹을 제외 할 SQL에서 WHERE 문을 사용하지만, 여기에 나는이처럼 보이는 테이블에서어떻게 복잡한 쿼리를

을 할 노력하고있어의 본질은합니다 :

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

위 표에는 2 개의 열이 있습니다. '2'열의 모든 행에서 '1'이있는 행을 쿼리하려고합니다. '0'과 '1'이 포함 된 'Bill'행부터 제외해야합니다. WHERE 문에서 하위 쿼리는 둘 이상의 결과를 제공하고 작동하지 않습니다. 내가 어떤 똑똑한 사람이 나의 탐구에서 저를 도와 수 있기를 바랍니다, 그래서 내 프로젝트에 두통의 완전히 새로운 수준을 가져다 줄 쿼리에서 루프 문의 양식을 사용

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

.

+0

쿼리가 "John"또는 아무것도 반환하지 않으면 위의 예제 데이터에서 명확하게하기 위해? – GarethD

답변

3

여러 접근법이 있습니다. 각각 하나는 귀하의 RDBMS 및 귀하가 가장 쉽게 찾을 수있는 것이 무엇이든간에 장점이 있습니다. 성능에 대한 자세한 내용은 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

감사합니다! 이것은 모든 것을 해결했습니다! – Sweetspot

0

시도 :

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 만 반환해야하며 질문의 쿼리를 기반으로 반환해야합니다 푸. HAVING COUNT (DISTINCT Col2) = 1 대신에'COV (COLL! = '0'THEN 1 END) = 0 '이 필요합니다.'HAVING COUNT (Col2) = COUNT (Col2 = '0'THEN 1 END) ' – GarethD

+0

죄송합니다 - Col2 ='1 '(단 하나의 값 대신) 만 반환하는 요구를 놓쳤습니다. 이에 따라 쿼리가 업데이트되었습니다. –

+0

Col2 = '1'을 반환하지 않지만 Bill을 제외하고 Bill의 Col2 중 일부 값이 '0'이므로 John 만 반환합니다. – Sweetspot

관련 문제