1

我有两个表名为表 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'

结果应该是 Document 1.doc (因为虽然它有超过 3 个单词,但它包含我要查找的所有 3 个单词)和 Document 3.doc (因为或运算符)

有任何想法吗?

4

1 回答 1

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<>小提琴演示

于 2019-01-18T21:56:45.133 回答