2

Itemテーブル、Categoryテーブル、およびキーのペアである多対多のItemCategoryテーブルを含むデータベース(NexusDB(おそらくSQL-92準拠))があります。ご想像のとおり、アイテムは複数のカテゴリに割り当てられています。

すべてのエンドユーザーに、次のすべてのアイテムを選択してもらいたい

ItemID | カテゴリ
ID--------------------------------
01 | 01
01 | 02
01 | 12

02 | 01
02 | 02
02 | 47

03 | 01
03 | 02
03 | 14
など...

カテゴリX、Y、およびZに割り当てられているが、カテゴリPおよびQには割り当てられていないすべてのItemIDを選択できるようにしたい。

たとえば、上記のデータの例では、カテゴリ01または02に割り当てられているが、12ではないすべてのアイテムを取得したいとします(アイテム02および03を生成します)。次のようなもの:

SELECT ItemID WHERE(CategoryID IN(01、02))

...そしてそのセットからSELECTItemIDWHERE NOT(CategoryID = 12)を削除します

これはおそらくかなり基本的なSQLの質問ですが、現時点では困惑しています。どんな助けでもありがたいです。

4

4 に答える 4

2

あなたは例外で試すことができます

SELECT ItemID FROM Table
EXCEPT
SELECT ItemID FROM Table
WHERE
CategoryID <> 12
于 2008-12-13T09:52:12.023 に答える
2

カテゴリ X、Y、および Z に割り当てられているが、カテゴリ P および Q には割り当てられていないすべての ItemID を選択できるようにしたいと考えています。

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;
于 2008-12-13T17:50:03.197 に答える
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 句に入れる必要があります。

于 2008-12-13T09:55:46.103 に答える
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
     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
于 2008-12-13T14:00:08.157 に答える