2011-11-30 61 views
0

我有以下表格:的SQL Server 2008 - 多列与值替换代码

TABLE_1:

 
Value_ID  Value_Code_1  Value_Code_2  Value_Code_3 
1   465    325    129 

TABLE_2:

 
ID   Text 
465   this is a value 
325   this value is a different one 
129   hello world 

我需要替换TABLE_1代码与来自Table_2的文本。我想解决这个问题的方式似乎很长很长,有没有更快,更好的方法呢?我必须这样做大约40列而不是3例如我的例子。

我的代码:

 
Select 
    first.ID, 
    first.string_value, 
    second.string_value, 
    third.string_value 
from 
(
    Select 
     a.ID, 
     b.text as string_value 
    From 
     table_1 a 
     left join 
     table_2 b 
     on a.Value_Code_1 = b.ID 
) first 

left join on first.id = second.id 

(
    Select 
     a.ID, 
     b.text as string_value 
    From 
     table_1 a 
     left join 
     table_2 b 
     on a.Value_Code_2 = b.ID 
) second 

left join on first.id = third.id 
(
    Select 
     a.ID, 
     b.text as string_value 
    From 
     table_1 a 
     left join 
     table_2 b 
     on a.Value_Code_2 = b.ID 
) third 

谢谢。

+0

你一直在说**替换**。我不认为这意味着你的想法。 – Yuck

+1

@yuck:公主新娘? :) – MatBailie

+0

@Dems:是的!我会把它称为**加入**作为替换**,从而推断您希望更新**数据。哦,语义... – Yuck

回答

2

你可以做到这一点简单的,就像这样:

Select 
    Table_1.ID, 
    v1.Text, 
    v2.Text, 
    v3.Text 
FROM Table_1 
LEFT JOIN Table_2 v1 ON Table_1.Value_code_1 = v1.id 
LEFT JOIN Table_2 v2 ON Table_1.Value_code_2 = v2.id 
LEFT JOIN Table_2 v3 ON Table_1.Value_code_3 = v3.id; 

你仍然需要做的是为所有40列。

+1

我找到了一个更简单的解决方案。我创建了一个函数,它返回文本,如果你给它一个ID,当我从表中选择,而不是使用Value_Code我使用dbo.my_Function(Value_Code),它的工作原理。 – alexstr

0

我不知道这是或多或少高性能40连接,或者如果它是更容易与否,但它是值得考虑的选择...

SELECT 
    Table1.Value_ID, 
    MAX(CASE WHEN Table1.Value_Code_1 = Table2.ID THEN Table2.Text ELSE NULL END) AS Text1, 
    MAX(CASE WHEN Table1.Value_Code_2 = Table2.ID THEN Table2.Text ELSE NULL END) AS Text2, 
    MAX(CASE WHEN Table1.Value_Code_3 = Table2.ID THEN Table2.Text ELSE NULL END) AS Text3, 
    MAX(CASE WHEN Table1.Value_Code_4 = Table2.ID THEN Table2.Text ELSE NULL END) AS Text4, 
    etc 
FROM 
    Table1 
LEFT JOIN 
    Table2 
    ON Table2.ID = Table1.Value_Code_1 
    OR Table2.ID = Table1.Value_Code_2 
    OR Table2.ID = Table1.Value_Code_3 
    OR Table2.ID = Table1.Value_Code_4 
GROUP BY 
    Table1.Value_ID 


如果你一定要规范你表1,它变得更容易了......

New Table1: 
> Value_ID, 
> Column_ID, 
> Value_Code 

New SQL: 
SELECT 
    Table1.Value_ID, 
    MAX(CASE WHEN Table1.Column_ID = 1 THEN Table2.Text ELSE NULL END) AS Text1, 
    MAX(CASE WHEN Table1.Column_ID = 2 THEN Table2.Text ELSE NULL END) AS Text2, 
    MAX(CASE WHEN Table1.Column_ID = 3 THEN Table2.Text ELSE NULL END) AS Text3, 
    MAX(CASE WHEN Table1.Column_ID = 4 THEN Table2.Text ELSE NULL END) AS Text4, 
    etc 
FROM 
    Table1 
LEFT JOIN 
    Table2 
    ON Table2.ID = Table1.Value_Code 
GROUP BY 
    Table1.Value_ID 

(这类似于使用UNPIVOT答案)