Ho creato un semplice esempio (si spera molto più divertente dei miei dati effettivi) per esprimere meglio il mio domanda:Come strutturare una query per darmi solo le righe che corrispondono a TUTTI i valori in un elenco CSV di ID in 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
esempio di cattivo query (non mostrando i risultati desiderati):
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
Quello che mi piacerebbe vedere:
Quando DECLARE @CSV_STRING VARCHAR(20) = '1,3'
dovrei vedere solo "Silver Surfer" si nce è l'unico con entrambe le abilità 1 e 3 correlate a Flight e Super Speed.
Quando DECLARE @CSV_STRING VARCHAR(20) = '1,2,3'
Non dovrei vedere qualsiasi eroi nel mio universo poiché non ci sono nessuno definito per elencare tutte e tre le abilità.
Ci deve essere qualcosa di semplice che mi manca. Ho provato a strutturare la query in molti modi diversi. Ho presentato la forma più semplice di questo qui per non complicare la presentazione del problema.
Nota:. Uso una funzione che agisce come un Split basato su delimitatore passata
Un tuffo sorprendentemente buona domanda. Interessato alla risposta a questo. –
+1 per l'utilizzo di supereroi nel tuo esempio =) –