【问题标题】:SQL Server 2008 - Replacing codes with values in multiple columnsSQL Server 2008 - 用多列中的值替换代码
【发布时间】:2012-01-09 16:26:56
【问题描述】:

我有以下表格:

表_1:

Value_ID Value_Code_1 Value_Code_2 Value_Code_3 1 465 325 129

表_2:

ID 文本 465 这是一个值 325 这个值是不同的 129你好世界

我需要将 Table_1 中的代码替换为 Table_2 中的文本。我想解决它的方式似乎很长而且很麻烦,有没有更快,更好的方法来做到这一点?我必须为大约 40 列而不是像我的示例中那样为 3 列。

我的代码:

选择 第一个.ID, first.string_value, second.string_value, 第三个.string_value 从 ( 选择 援助, b.text 作为 string_value 从 table_1 一个 左连接 表_2 b 在 a.Value_Code_1 = b.ID ) 第一的 左加入 first.id = second.id ( 选择 援助, b.text 作为 string_value 从 table_1 一个 左连接 表_2 b 在 a.Value_Code_2 = b.ID ) 第二 left join on first.id = third.id ( 选择 援助, b.text 作为 string_value 从 table_1 一个 左连接 表_2 b 在 a.Value_Code_2 = b.ID ) 第三

谢谢。

【问题讨论】:

  • 你一直在说替换。我不认为它意味着你认为它的意思。
  • @Dems:是的!我会称它为 joining,因为 replaceing 表示您想要 update 数据。哦,语义...
  • @yuck - “查找并改用”?

标签: sql sql-server-2008 select left-join


【解决方案1】:

你可以做的更简单,像这样:

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 列执行此操作。

【讨论】:

  • 我找到了一个更简单的解决方案。我创建了一个函数,如果你给它一个 ID,它会返回文本,当我从表中选择时,我使用 dbo.my_Function(Value_Code) 而不是使用 Value_Code,它可以工作。
【解决方案2】:

我不知道这是否比 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


如果您要规范化您的 Table1,它会变得更加容易......

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的答案)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多