选择必须包含某些值的行

时间:2019-01-18 21:51:53

标签: sql-server tsql

我有两个表,分别称为表A和表B。表A是单词列表,而表B是与这些单词相关的文档列表。我需要进行搜索,以检索哪些文档包含我要查找的全部单词或其中的一些单词。

表结构和数据示例如下:

Declare @TableA Table (IdWord Int, Word Varchar(100))
Declare @TableB Table (IdProcess Int, IdWord Int, Document Varchar(100))

Insert Into @TableA Values (1, 'A');
Insert Into @TableA Values (2, 'B');
Insert Into @TableA Values (3, 'C');
Insert Into @TableA Values (4, 'D');
Insert Into @TableA Values (5, 'E');

Insert Into @TableB Values (1, 1, 'Document 1.doc');
Insert Into @TableB Values (1, 2, 'Document 1.doc');
Insert Into @TableB Values (1, 3, 'Document 1.doc');
Insert Into @TableB Values (1, 4, 'Document 1.doc');

Insert Into @TableB Values (2, 1, 'Document 2.doc');
Insert Into @TableB Values (2, 2, 'Document 2.doc');

Insert Into @TableB Values (3, 5, 'Document 3.doc');

我一直在思考如何解决以下逻辑:

(Word='A' And Word='B' And Word='C') Or Word='E'

哪些结果应作为文档1.doc(因为它包含3个以上的单词,但包含我要查找的所有3个单词)和文档3.doc(由于或运算符)

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

使用HAVING

SELECT Document
FROM @TableA A
JOIN @TableB B
  ON B.IdWord = A.IdWord
WHERE Word IN ('A', 'B','C', 'E')
GROUP BY Document
HAVING COUNT(DISTINCT CASE WHEN Word IN ('A','B', 'C') THEN Word END) = 3
    OR COUNT(DISTINCT CASE WHEN Word IN ('E') THEN Word END) = 1

db<>fiddle demo