How can I structure a query to give me only the rows that match ALL values in a CSV list of IDs in T-SQL

前端 未结 2 1253
日久生厌
日久生厌 2020-12-06 06:02

I\'ve created a simple example (hopefully much more fun than my actual data) to better express my question:

CREATE TABLE SUPER_HERO
(   ID INT,
    NAME VAR         


        
2条回答
  •  遥遥无期
    2020-12-06 06:41

    This is divided in two parts, the filter, and the rest of the query so it is easy to extend

    DECLARE @DELIMITER CHAR = ','
    DECLARE @CSV_STRING VARCHAR(20) = '1,3'
    
    SELECT @TOTREQ = COUNT(DISTINCT ITEMS) FROM dbo.Split(@CSV_STRING, @DELIMITER)
    
    SELECT 
         SUPER_HERO_NAME =   SUPER_HERO.NAME
    FROM 
        SUPER_HERO INNER JOIN
        (SELECT SUPER_HERO_SKILL.SUPER_HERO_ID
         FROM SUPER_HERO_SKILL     
         LEFT JOIN dbo.Split(@CSV_STRING, @DELIMITER) SPLIT ON SUPER_HERO_SKILL.SKILL_ID = SPLIT.ITEMS
         GROUP BY SUPER_HERO_SKILL.SUPER_HERO_ID
         HAVING COUNT(SPLIT.ITEMS) = @TOTREQ      -- This ensure no mising super-powers
            AND COUNT(*) = @TOTREQ                -- This ensure no extra super-powers  (can be omited of course)
         ) AS FILTER ON     SUPER_HERO.ID = FILTER.SUPER_HERO_ID
    

提交回复
热议问题