2012-07-25 4 views
2

저는 거의 하루 종일이 문제에 봉착했습니다. 원하는 결과 집합을 반환하는 쿼리를 작성하지 못했고 심지어 알지도 못했습니다. 내가 직면하고있는이 이슈를 올바르게 말하는 법.TSQL - 유일한 기준을 충족하는 사용자를 제외하십시오

에만 '9 %'와 같은 ItemNumber 레코드가있는 고객을 제외하거나 플래그를 지정하는 것이 목표입니다. 그 레코드와 연관된 ONLY ItemNumbers '이 9 %'처럼이 예에서는

CustomerID ItemNumber 
    85610   99 
    85611   11 
    85611   99 
    85612   13 
    85612   11 
    85612   98 
    85613   98 
    85613   99 

는 CustomerIDs 86,510 및 86,513이 제외 또는 신고한다.

저는 계속 지키 겠지만, 제가 간과하고있는 것이 정말 간단하다는 느낌이 들었습니다. 나는 도움을 주셔서 감사합니다.

마이크

답변

6
SELECT CustomerID, ItemNumber 
    FROM dbo.table AS t 
    WHERE NOT EXISTS 
    (
    SELECT 1 FROM dbo.table 
    WHERE CustomerID = t.CustomerID 
    AND ItemNumber NOT LIKE '9%' 
); 
+1

일이있는 WHERE 조항을 포함하지 - 매우 영리한. 관련 메모에서 테이블의 실제 칼럼 대신'EXISTS'에'SELECT 1'을 사용하면 성능이 향상됩니까? – Lamak

+1

@Lamak 아니, 성능 차이는 없습니다. SQL Server는 EXISTS 내부의 모든 항목을 구체화 할 필요가 없음을 알고 있습니다. SELECT * 또는 SELECT를 열 수 있으며 계획을 조금 변경하지는 않습니다. 저는이 하위 쿼리가 어떤 데이터도 선택하지 않는다는 것을 독자에게 분명히 알기 때문에 상수를 사용하는 것을 좋아합니다. –

+0

확인해 주셔서 감사합니다. – Lamak

2
SELECT 
    CustomerID 
FROM Table T 
WHERE NOT EXISTS (SELECT CustomerID FROM Table WHERE CustomerId = T.CustomerId AND ItemNumber NOT LIKE '9%') 
+1

아론은 그의 질문을 끝냈습니다. 바로 지금 제가 느끼는 방식입니다. – Aushin

+0

두 답변 모두에 중요한 차이가 있습니다. Aaron은 '별로 좋아하지 않습니다'9 % '를 사용하고 있습니다. 올바른 사람인 경우'좋아요 9 % '를 사용하고 있는데 예상대로 작동하지 않습니다. – Lamak

+0

오, 그리고 +1 왜냐하면 저는 스포츠맨이고 당신의 의견은 나를 웃게했습니다. . –

-1

내가 뭔가를 누락하지 않는 한, 왜 단지 ItemNumber NOT LIKE '9%'

+0

네, 뭔가 빠진 것 같아요. 추천 항목이 작동하지 않는 이유는 단순한 where 절에 ItemNumber가 99이지만 다른 행에 ItemNumber가 11 인 고객이 포함되기 때문입니다. –

+0

나는 thx를 본다. 당신의 질의가 정확하다면 – johnnyarguelles

2

또 다른 옵션

SELECT CustomerID 
FROM YourTable 
GROUP BY CustomerID 
HAVING MAX(CASE WHEN ItemNumber LIKE '9%' THEN 1 END) = 1 
    AND MAX(CASE WHEN ItemNumber NOT LIKE '9%' THEN 1 END) IS NULL 
+0

여기에 단점은'ItemNumber'를 얻기 위해 테이블에 다시 조인 할 필요가 있다는 것입니다.이 칼럼이 필요 없다면, 이것은'EXISTS'보다 더 잘 수행 할 수 있을까요? – Lamak

+0

@ 라 막 - 테이블을 1 회 스캔 할 수 있습니다. 두 가지를 비교하고 인덱스와 데이터 분포의 서로 다른 조합을 시도하기 위해 일부 테스트 데이터를 설정하지 않고 추측하고 싶지 않습니다. –

+0

@Lamak - OP의 예제 데이터와 다음 테이블 정의에 대해서'CREATE TABLE # 사용자 테이블 (CustomerID INT, ItemNumber INT, PRIMARY KEY (CustomerID, ItemNumber))'나는 [이 계획과 예상 비용을받습니다.] (http : // i .stack.imgur.com/e6Xul.jpg). 색인을 제거하고 [나는이 계획과 비용을 얻는다.] (http://i.stack.imgur.com/8pOA0.jpg) –

0
create table tc(CustomerID int,ItemNumber varchar(10)) 

INSERT INTO tc 
VALUES(85610,99), 
    (85611,11), 
    (85611,99), 
    (85612,13), 
    (85612,11), 
    (85612,98), 
    (85613,98), 
    (85613,99) 

select CustomerID from tc 
where ItemNumber like '9%' 
group by CustomerID 

except 

select CustomerID from tc 
where ItemNumber not like '9%' 
group by CustomerID 
관련 문제