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 不能同时是两个不同的值。

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

2

尝试这个:

SELECT DISTINCT i.Id
FROM Items i
INNER JOIN ItemsTags it1 ON i.Id = it1.ItemId and it1.TagName='Tag1'
INNER JOIN ItemsTags it3 ON i.Id = it3.ItemId and it3.TagName='Tag3'

是一个 SQL Fiddle。

于 2013-08-08T21:03:54.353 回答
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 回答
1

另一种方法:

SELECT DISTINCT Items.Id FROM Items  
WHERE 
     Items.Id IN (SELECT ItemId FROM ItemsTags WHERE TagName = 'Tag1') AND
     Items.Id IN (SELECT ItemId FROM ItemsTags WHERE TagName = 'Tag3')
于 2013-08-08T21:10:49.050 回答
1

使用存在子句:

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 回答
0

这样做的另一种可能方式只是为了说明在 sql 中做任何事情的无数可能方式,这一次,采用与其他方式截然不同的方法。

SELECT i.Id
FROM Items i
JOIN (
  SELECT ItemId
  FROM ItemsTags
  WHERE TagName IN ('Tag1', 'Tag3')
  GROUP BY ItemId
  HAVING COUNT(*) > 1
) t ON t.ItemId = i.Id

SqlFiddle

于 2013-08-08T21:38:23.170 回答