代码之家  ›  专栏  ›  技术社区  ›  rory.ap

从另一列包含集合中所有值的记录中查找唯一的列值

  •  0
  • rory.ap  · 技术社区  · 6 年前

    假设我有一张这样的桌子:

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

    我想找到独一无二的 ID 身份证件 那些有 全部的 Word WHERE Word IN ('a', 'dog', 'has') 会回来的 身份证件 1 但是 WHERE Word IN ('a', 'dog', 'has', 'black') NULL .

    这可能吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Gordon Linoff    6 年前

    使用 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
    
        2
  •  0
  •   Chad Estes    6 年前

    如果您使用的是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,','));