Найти уникальное значение столбца из записей, где другой столбец имеет ВСЕ значения из набора - PullRequest
0 голосов
/ 11 октября 2018

Допустим, у меня есть такая таблица:

+----+-------+
| ID | Word  |
+----+-------+
|  1 | a     |
|  1 | dog   |
|  1 | has   |
|  2 | two   |
|  2 | three |
|  2 | four  |
|  2 | five  |
|  3 | black |
|  3 | red   |
+----+-------+

Я хочу найти уникальное значение ID, где есть записи с этим ID, которые имеют все иззначения Word в предоставленном наборе.Например, WHERE Word IN ('a', 'dog', 'has') вернет ID значение 1, но WHERE Word IN ('a', 'dog', 'has', 'black') вернет NULL.

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Если вы используете SQL 2016 или выше, это кажется хорошим решением:

--Load test data
DECLARE @tbl as TABLE (id int, word varchar(40))
INSERT INTO @tbl
(id, word)
VALUES
(1, 'a'),(1,'dog'),(1,'cat'),(1,'has'),(1,'a'),(2,'two'),(2,'three'),(2,'four'),(2,'five'),(3,'black'),(3,'red')

--ACTUAL SOLUTION STARTS HERE
DECLARE @srch as VARCHAR(200)
SET @srch = 'a,dog,has'

SELECT id 
FROM @tbl
WHERE word IN (SELECT value FROM STRING_SPLIT(@srch,','))
GROUP BY id
HAVING COUNT(DISTINCT word) = (SELECT COUNT(DISTINCT value) FROM STRING_SPLIT(@srch,','));
0 голосов
/ 11 октября 2018

Используйте group by и having:

select id
from t
where word in ('a', 'dog', 'has')
group by id
having count(*) = 3;  - the number of words in the list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...