0

次のように定義された 2 つのテーブルがあるとします。

Items
-----
Id (Primary Key)
ItemName


ItemsTags
-----
ItemId (Primary Key)
TagName (Primary Key)

次のデータを入力します。

Items
-----
1, Item1
2, Item2
3, Item3

ItemsTags
--------
1, Tag1
1, Tag2
1, Tag3
2, Tag3
3, Tag4
3, Tag5

Tag1 または Tag3 のいずれかが割り当てられたアイテムを検索すると仮定すると、次のクエリが機能します。

SELECT DISTINCT Items.Id
FROM Items INNER JOIN ItemsTags
    ON Items.Id = ItemsTags.ItemId
WHERE ItemsTags.TagName = 'Tag1' OR ItemsTags.TagName = 'Tag3'

1 と 3 が返されます。

ただし、そのクエリを変更して、Tag1 と Tag3 の両方を持つアイテムを取得するにはどうすればよいですか? 次のクエリは明らかに機能しません。これは、任意の行で TagName を一度に 2 つの異なる値にすることはできないためです。

SELECT DISTINCT Items.Id
FROM Items INNER JOIN ItemsTags
     ON Items.Id = ItemsTags.ItemId
WHERE ItemsTags.TagName = 'Tag1' AND ItemsTags.TagName = 'Tag3'

正しいクエリは何ですか? 私の例では、アイテム 1 のみを取得したいと考えています。

4

5 に答える 5

1

exists 句を使用します。

SELECT 
    Items.Id 
FROM 
    Items  
Where 
    Exists (
        Select top 1 1 
        FROM 
            ItemsTags 
        WHERE 
            ItemsTags.ItemId = Items.Id    
            and (ItemsTags.TagName= 'Tag1') 
    )
 AND 
 Exists (
        Select top 1 1 
        FROM 
            ItemsTags 
        WHERE 
            ItemsTags.ItemId = Items.Id    
            and (ItemsTags.TagName= 'Tag3') 
    )
于 2013-08-08T21:08:55.477 に答える
1

このようにすることもできます。

SELECT items.ID
FROM items
INNER JOIN ItemsTags ON
  Items.Id = ItemsTags.ItemId
WHERE ItemsTags.TagName IN ('Tag1','Tag3')
GROUP BY
 items.ID
HAVING COUNT(*) = 2
于 2013-08-08T21:53:35.167 に答える