2008-12-13 57 views
2

我有一個數據庫(NexusDB(據稱是SQL-92兼容)),其中包含和Item表,一個Category表和一個多對多的ItemCategory表,它只是一對鍵。正如您所期望的那樣,項目被分配到多個類別。SQL的問題:不包括記錄

,我想所有的最終用戶選擇哪些是

項目ID的所有項目| CategoryID
--------------------------------
01 | 01
01 | 02
01 | 12

02 | 01
02 | 02
02 | 47

03 | 01
03 | 02
03 | 14
等...

我希望能夠選擇分配給類別X,Y和Z,但沒有分配到分類P和Q

對於上面的示例數據的所有項目ID的例如,假設我想抓取分配給類別01或02但不是12的所有項目(產生項目02和03)。沿着線的東西:

SELECT項目ID WHERE(類別ID IN(01,02))

...,並從該組刪除選擇的ItemID WHERE NOT(類別id = 12)

這可能是這是一個非常基本的SQL問題,但目前它困擾着我。任何幫助W/B讚賞。

+0

謝謝大家!湯姆的回答對我所需要的是完美的,但對我來說都是信息豐富的。很多學習SQL仍然(我相信我會回來w /更多的問題)...感謝您的幫助。 :) – Jamo 2008-12-13 20:30:09

回答

2

您可以嘗試與除

SELECT ItemID FROM Table 
EXCEPT 
SELECT ItemID FROM Table 
WHERE 
CategoryID <> 12 
1
SELECT i.ItemID, ic.CategoryID FROM Item AS i 
INNER JOIN ItemCategory ic 
ON i.ItemID = ic.ItemID 
WHERE ic.CategoryId = 1 OR ic.CategoryId = 2 

當然,你需要把WHERE子句你想獲得哪些類別英寸

+0

即使它們不在第2類中,這也會得到第1類中的物品。我不認爲這是原始海報所需要的。 – 2008-12-13 13:41:38

0

對於你有一個較低的和已知數量的類別,你可以簡單地用幾個簡單的情況下加入到檢查存在和不存在:

SELECT 
    ItemID 
FROM 
    Items I 
INNER JOIN ItemCategories IC1 ON IC1.ItemID = I.ItemID AND IC1.CategoryID = '01' 
INNER JOIN ItemCategories IC2 ON IC2.ItemID = I.ItemID AND IC2.CategoryID = '02' 
LEFT OUTER JOIN ItemCategories IC3 ON IC3.ItemID = I.ItemID AND IC3.CategoryID = '12' 
WHERE IC3.ItemID IS NULL 

對於更一般的情況下,給定一個未知匹配中的項目數量與列表不匹配,可以使用以下查詢。我已經爲每個列表使用了一個表變量(在SQL Server中可用),但是您可以根據需要對實際表或變量/參數列表使用select。這個想法是一樣的:

SELECT 
    ItemID 
FROM 
    Items I 
WHERE 
    (
     SELECT COUNT(*) 
     FROM ItemCategories IC1 
     WHERE IC1.ItemID = I.ItemID 
     AND IC.CategoryID IN 
      (SELECT CategoryID FROM @MustHaves) 
    ) = (SELECT COUNT(*) FROM @MustHaves) AND 
     (
     SELECT COUNT(*) 
     FROM ItemCategories IC1 
     WHERE IC1.ItemID = I.ItemID 
     AND IC.CategoryID IN 
      (SELECT COUNT(*) FROM @MustNotHaves) 
    ) = 0 
2

我希望能夠選擇分配給 分類X,Y和Z但不 分配到分類P和Q

所有 項目ID的

我無法從關於SELECT的NexusDB文檔中確認它們支持子查詢,但它們確實支持LEFT OUTER JOIN和GROUP BY。所以這裏是一個查詢,在這些限制內工作:

SELECT i1.ItemID 
FROM ItemCategory i1 
    LEFT OUTER JOIN ItemCategory i2 
    ON (i1.ItemID = i2.ItemID AND i2.CategoryID IN ('P', 'Q')) 
WHERE i1.CategoryID IN ('X', 'Y', 'Z') 
    AND i2.ItemID IS NULL 
GROUP BY i1.ItemID 
HAVING COUNT(i1.CategoryID) = 3; 
+0

不錯的方法+1 :) – 2008-12-13 18:09:08