Étiquette multiple d'une table de search

J'ai une grosse requête qui doit montrer plusieurs labels .

 DECLARE @Example TABLE ( [ID] INT IDENTITY(1,1) ,[CountryID] INT ,[Choise_1_id] INT ,[Choise_2_id] INT ,[Choise_3_id] INT ,[Choise_4_id] INT ,[Choise_5_id] INT ); INSERT INTO @Example ([CountryID], [Choise_1_id], [Choise_2_id], [Choise_3_id], [Choise_4_id], [Choise_5_id]) VALUES (101, 1, 2, 3, 4, 5) ,(102, 2, 3, NULL, NULL, NULL) ,(103, 5, 2, 4, NULL, NULL) ,(104, 3, 2, 4, 1, 5); DECLARE @LableLookup TABLE ( [Label_ID] INT IDENTITY(1,1) ,[Value] VARCHAR(50) ); INSERT INTO @LableLookup ([Value]) VALUES ('Test 1') ,('Test 2') ,('Test 3') ,('Test 4') ,('Test 5'); 

Je dois montrer chaque label, donc la requête ressemble à ceci:

 SELECT l1.Value,l2.Value,l3.Value,l4.Value,l5.Value FROM @Example E LEFT JOIN @LableLookup l1 ON l1.Label_ID = E.CountryId LEFT JOIN @LableLookup l2 ON l2.Label_ID = E.Choise_1_id LEFT JOIN @LableLookup l3 ON l3.Label_ID = E.Choise_2_id LEFT JOIN @LableLookup l4 ON l4.Label_ID = E.Choise_3_id LEFT JOIN @LableLookup l5 ON l5.Label_ID = E.Choise_4_id ... 

Y a-t-il une meilleure manière de faire cela? Je ne veux pas parsingr la table LabelLookup pour chaque colonne. Il pourrait y avoir des dizaines de Choise_ids dans la table.

Vous pouvez replace les multiples clauses LEFT JOIN clauses UNPIVOT et INNER JOIN :

 DECLARE @DataSource TABLE ( [ID] INT IDENTITY(1,1) ,[CountryID] INT ,[Choise_1_id] INT ,[Choise_2_id] INT ,[Choise_3_id] INT ,[Choise_4_id] INT ,[Choise_5_id] INT ); INSERT INTO @DataSource ([CountryID], [Choise_1_id], [Choise_2_id], [Choise_3_id], [Choise_4_id], [Choise_5_id]) VALUES (101, 1, 2, 3, 4, 5) ,(102, 2, 3, NULL, NULL, NULL) ,(103, 5, 2, 4, NULL, NULL) ,(104, 3, 2, 4, 1, 5); DECLARE @LableLookup TABLE ( [LabelID] INT IDENTITY(1,1) ,[Value] VARCHAR(50) ); INSERT INTO @LableLookup ([Value]) VALUES ('Test 1') ,('Test 2') ,('Test 3') ,('Test 4') ,('Test 5'); SELECT * FROM @DataSource UNPIVOT ( [LabelID] FOR [Choise] IN ([Choise_1_id], [Choise_2_id], [Choise_3_id], [Choise_4_id], [Choise_5_id]) ) UNPVT INNER JOIN @LableLookup LL ON UNPVT.[LabelID] = LL.[LabelID]; 

Le résultat est comme ceci:

entrez la description de l'image ici

Vous pouvez continuer à manipuler le jeu de résultats si vous n'en avez pas besoin dans un tel format.

Votre code devrait être raisonnablement efficace si vous avez un index sur LabelLookup(Labeld) (et si vous LabelLookup(Labeld) les conditions de join ).

Cependant, si c'est généralement une mauvaise idée d'avoir plusieurs colonnes dans une rangée dont la seule caractéristique distinctive est un nombre à la fin.

Au lieu de cela, vous voulez une autre table, avec sur la ligne par CountryId et ChoiseId – et peut-être d'autres informations telles que quelque chose pour indiquer la command.