2012-07-25 62 views
2

我一直堅持這一整天,我似乎無法得到一個查詢返回給我想要的結果集,我也不知道如何正確地說出我面臨的這個問題。TSQL - 排除符合條件的用戶

我們的目標是排除或以其他方式標記只有具有「9%」的ItemNumber記錄的客戶。

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

在這個例子中,CustomerIDs 86510和86513應排除,或標記,與它們的記錄相關的唯一ItemNumbers像「9%」。

我要繼續保持它,但我覺得這是一件非常簡單的事,我可以忽略,我希望有任何幫助。

邁克

回答

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

+1 WHERE條款 - 非常聰明。在一個相關的說明中,在'EXISTS'上使用'SELECT 1'而不是表中的真實列會有性能提升嗎? – Lamak 2012-07-25 20:36:33

+1

@Lamak不,沒有性能差異。 SQL Server知道EXISTS中的任何內容都不需要實現。你可以把SELECT *或SELECT任何列,它不會改變計劃一點。我喜歡使用常量,因爲讀者很清楚這個子查詢不會選擇任何數據。 – 2012-07-25 20:40:15

+0

好的,謝謝你的澄清 – Lamak 2012-07-25 20:41:17

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

亞倫已經結束了他的查詢);這正是我現在的感受。 – Aushin 2012-07-25 20:35:34

+0

雖然兩個答案都有一個關鍵的區別。 Aaron正在使用'NOT LIKE'9%''而且它正確,你正在使用'LIKE'9%'''而且不會按預期工作 – Lamak 2012-07-25 20:37:41

+0

哦,因爲我是運動員,你的評論讓我笑。 – 2012-07-25 20:38:25

-1

除非我失去了一些東西,爲什麼不包括具有ItemNumber NOT LIKE '9%'

+0

是的,我想你錯過了一些東西。您的建議不起作用的原因是因爲一個簡單的where子句將包括ItemNumber爲99的客戶,但在另一行中也可能具有11的ItemNumber。 – 2012-07-25 20:37:28

+0

我看到thx。你的查詢是正確的然後 – johnnyarguelles 2012-07-25 20:40:49

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's,它需要再次與表連接,對吧?如果不需要該列,那麼這個表現會比'EXISTS'好嗎? – Lamak 2012-07-25 20:49:31

+0

@Lamak - 它可能是通過表的一次掃描。如果不設置一些測試數據來比較兩者並嘗試索引和數據分佈的不同組合,就不會猜測。 – 2012-07-25 20:53:14

+0

@Lamak - 對於OP的示例數據和下面的表定義:CREATE TABLE #YourTable(CustomerID INT,ItemNumber INT,PRIMARY KEY(CustomerID,ItemNumber))''我得到[這些計劃和估計的成本。](http:// i .stack.imgur.com/e6Xul.jpg)。擺脫索引和[我得到這些計劃和成本](http://i.stack.imgur.com/8pOA0.jpg) – 2012-07-25 21:11:43

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