Как я могу структурировать запрос, чтобы выдавать мне только те строки, которые соответствуют ВСЕМ значениям в списке идентификаторов CSV в T-SQL

Я создал простой пример (надеюсь, более интересный, чем мои настоящие данные), чтобы лучше выразить свой вопрос:

CREATE TABLE SUPER_HERO
(   ID INT,
    NAME VARCHAR(50)
)

INSERT INTO SUPER_HERO VALUES (1, 'Storm')
INSERT INTO SUPER_HERO VALUES (2, 'Silver Surfer')
INSERT INTO SUPER_HERO VALUES (3, 'Spider Man')

CREATE TABLE SKILL
(   ID INT,
    NAME VARCHAR(50)
)

INSERT INTO SKILL VALUES (1, 'Flight')
INSERT INTO SKILL VALUES (2, 'Weather Control')
INSERT INTO SKILL VALUES (3, 'Super Speed')

CREATE TABLE SUPER_HERO_SKILL
(   SUPER_HERO_ID INT,
    SKILL_ID INT
)

INSERT INTO SUPER_HERO_SKILL VALUES (1, 1) --Storm has Flight
INSERT INTO SUPER_HERO_SKILL VALUES (1, 2) --Storm has Weather Control
INSERT INTO SUPER_HERO_SKILL VALUES (2, 1) --Silver Surfer has Flight
INSERT INTO SUPER_HERO_SKILL VALUES (2, 3) --Silver Surfer has Super Speed
INSERT INTO SUPER_HERO_SKILL VALUES (3, 3) --Spider Man has Super Speed

Пример неверного запроса (не показывающий желаемых результатов):

DECLARE @DELIMITER CHAR = ','
DECLARE @CSV_STRING VARCHAR(20) = '1,3'

SELECT 
    SUPER_HERO_NAME =   SUPER_HERO.NAME,
    SKILL_NAME      =   SKILL.NAME
FROM 
    SUPER_HERO
    JOIN SUPER_HERO_SKILL ON  SUPER_HERO_SKILL.SUPER_HERO_ID = SUPER_HERO.ID
    JOIN SKILL ON SUPER_HERO_SKILL.SKILL_ID = SKILL.ID
    JOIN dbo.Split(@CSV_STRING, @DELIMITER) SPLIT  ON SPLIT.ITEMS = SKILL.ID

Что я хотел бы см .:
Когда DECLARE @CSV_STRING VARCHAR (20) = '1,3' я должен видеть только «Серебряного Серфера», поскольку он единственный, у кого есть навыки 1 и 3, которые соотносятся с Полетом и Супер скорость.

Когда DECLARE @CSV_STRING VARCHAR (20) = '1,2,3' я не должен видеть каких-либо героев в моей вселенной, поскольку не определено ни одного, обладающего всеми тремя навыками. перечисленные.


Должно быть что-то простое, чего мне не хватает. Я пробовал структурировать запрос разными способами. Я представил здесь простейшую форму, чтобы не усложнять изложение проблемы.

Примечание: я использую функцию, которая действует как Split на основе переданного разделителя.

12
задан CharithJ 21 September 2011 в 12:49
поделиться