SQL查询,提供与多个列匹配的不同结果

Zar*_*doz 4 sql database h2

对不起,我无法为我的问题提供更好的标题,因为我对SQL很新.我正在寻找一个解决以下问题的SQL查询字符串.

我们假设下表:

DOCUMENT_ID |     TAG
----------------------------
   1        |   tag1
   1        |   tag2
   1        |   tag3
   2        |   tag2
   3        |   tag1
   3        |   tag2
   4        |   tag1
   5        |   tag3

现在我想选择包含一个或多个标签的所有不同文档ID(但必须提供所有指定的标签).例如:选择带有tag1的所有document_id,并且tag2将返回1和3(但不是4,例如因为它没有tag2).

最好的方法是什么?

问候,凯

Joh*_*sch 14

SELECT document_id
FROM table
WHERE tag = 'tag1' OR tag = 'tag2'
GROUP BY document_id
HAVING COUNT(DISTINCT tag) = 2
Run Code Online (Sandbox Code Playgroud)

编辑:

因缺乏约束而更新......


bea*_*ach 7

这假定DocumentID和Tag是主键.

编辑:更改了HAVING子句以计算DISTINCT标记.这样,主键是什么并不重要.

测试数据

-- Populate Test Data
CREATE TABLE #table (
  DocumentID varchar(8) NOT NULL, 
  Tag varchar(8) NOT NULL
)

INSERT INTO #table VALUES ('1','tag1')
INSERT INTO #table VALUES ('1','tag2')
INSERT INTO #table VALUES ('1','tag3')
INSERT INTO #table VALUES ('2','tag2')
INSERT INTO #table VALUES ('3','tag1')
INSERT INTO #table VALUES ('3','tag2')
INSERT INTO #table VALUES ('4','tag1')
INSERT INTO #table VALUES ('5','tag3')

INSERT INTO #table VALUES ('3','tag2')  -- Edit: test duplicate tags
Run Code Online (Sandbox Code Playgroud)

询问

-- Return Results
SELECT DocumentID FROM #table
WHERE Tag IN ('tag1','tag2')
GROUP BY DocumentID
HAVING COUNT(DISTINCT Tag) = 2
Run Code Online (Sandbox Code Playgroud)

结果

DocumentID
----------
1
3
Run Code Online (Sandbox Code Playgroud)