2015-04-27 40 views
1

我有一個很大的查詢,它必須顯示多個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'); 

我必須表現出每一個標籤,所以查詢的樣子:

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 
... 

有沒有更好的方式來做到這一點? 我不想掃描每個列的LabelLookup表。 表中可能有幾十個Choise_ids

回答

1

可以代替多個LEFT JOIN條款與UNPIVOTINNER 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]; 

的結果是這樣的:

enter image description here

您可以繼續manipulateing結果集,如果你不需要這種格式。

1

如果您的索引號爲LabelLookup(Labeld)(如果您修復了join條件),則您的代碼應該合理高效。

但是,如果在一行中有多個列是唯一區別特徵是數字的通常是一個壞主意。

取而代之,您需要另一個表格,其中每個表格的行號爲CountryIdChoiseId - 也許還有其他信息,例如指示排序的信息。

+0

對不起,輸入我的查詢。請再看一次。 – PeterRing

+0

@PeterRing。 。 。同樣的想法仍然有效。 –

+0

我不這麼認爲。這個國家和Choise沒有任何聯繫,這只是一個不好的例子。 – PeterRing