2010-06-04 110 views
1

好的,我需要一個T-SQL這個專家。SQL查詢選擇計數= 0

我有一個名爲PackageStoreEvents的表,它有一個packageid,storecode和一個eventcode字段。我想返回storecode 2406的packageid值,其中eventcode = 6的計數爲0.

我該怎麼做?

我被困在這一個。

感謝您的幫助

回答

6

這不是非常漂亮,但應該工作。您在連接條件中將連接留在同一個表中,包括事件代碼,聲明右表沒有包含IS NULL的行,然後執行DISTINCT以避免將以其他方式返回的許多行。

SELECT DISTINCT p1.packageid 
FROM PackageStoreEvents p1 
     LEFT JOIN 
       PackageStoreEvents p2 
       ON p1.packageid = p2.packageid 
       AND p1.storecode = p2.storecode 
       AND p2.eventcode = 6 
WHERE p2.packageid IS NULL 
AND p1.storecode = 2406 
+0

這將工作,但它絕對不是最好的方法。 – Kenneth 2010-06-04 13:21:44

+0

+1作爲低音長號演奏者 – 2010-06-04 13:22:25

+0

@Kenneth - 所以發佈一個更好的。這是迄今爲止唯一一個真正能夠工作的人。 – 2010-06-04 13:24:36

-2

也許這?:

SELECT PackageID 
FROM PackageStoreEvents 
WHERE Storecode = 2406 and EventCode = 6 
GROUP BY PackageID 
HAVING COUNT(EventCode) = 0 
+0

你打敗了我。唯一不同的是您返回的不必要的列。無論哪種方式,你都有我的投票。 – Kenneth 2010-06-04 13:21:12

+0

這不起作用。您的WHERE子句將強制此查詢僅獲取EventCode等於6的行。然後,您的HAVING將過濾掉所有這些行。 – 2010-06-04 13:23:45

+0

這不起作用。 WHERE和它們之間的HAVING將確保沒有行被返回。 – 2010-06-04 13:23:58

1
SELECT packageid 
FROM 
PackageStoreEvents p1 
WHERE storecode = 2406 
AND NOT EXISTS (SELECT * FROM PackageStoreEvents p2 
       WHERE p1.packageid = p2.packageid 
       AND p1.storecode = p2.storecode 
       AND p2.eventcode = 6) 
2

假設我正確地理解這個問題,我會用的東西沿着這行:

-- PackageStoreEvents (packageid, storecode, eventcode) 

SELECT DISTINCT packageid 
    FROM PackageStoreEvents r 
WHERE storecode = 2406 
    AND NOT EXISTS (SELECT * 
         FROM PackageStoreEvents cnt 
        WHERE cnt.packageid = r.packageid 
         AND cnt.storecode = r.storecode 
         AND cnt.eventcode = 6) 
+0

LOL,我打字慢了一下,馬丁打了我一分鐘=) (但是,讓人放心的是兩個人來了與同樣的解決方案..至少我不是唯一一個看起來愚蠢的結果是錯誤的= P) – deroby 2010-06-04 13:39:49

+1

Sjeezzz,我需要3個編輯才能把它弄好......(並沒有看到雙倍不,直到你指出它......感謝上帝這是星期五!) (我只敢_assume_它現在...) – deroby 2010-06-04 13:48:05

7

嘗試:

select packageid 
from PackageStoreEvents 
where storecode = 2406 
group by packageid 
having sum(case eventcode when 6 then 1 else 0 end)=0; 

用於單遍查詢。

+0

+1我喜歡這個解決方案。 (順便說一句,我修正了它的代碼格式) – 2010-06-04 15:03:44

+0

看起來對我來說是最有效的選擇。 – 2010-06-04 15:04:55