对使用查找值的表进行反规范化?

时间:2017-11-09 23:36:59

标签: sql sql-server lookup-tables

我有两张桌子。表1是基本的"联系人"样式表与各种个人专栏。表1中的一个字段是引用表2的查阅列。我想要创建一个新列,或者使用表2中的实际查找值设置表1中的空列。执行此操作的最有效方法是什么在MSSQL中,处理时间(即大量行)最小化了吗?

3 个答案:

答案 0 :(得分:1)

没有多少事实可供使用,但在添加新列后,您可以使用cte在该列中建立值。

ALTER TABLE table1
ADD newcol varchar(50);

WITH
      cte AS (
                  SELECT
                        table1.id
                      , table1.newcol
                      , table2.name AS newcol_value
                  FROM table1
                  INNER JOIN table2 ON table1.table2_fk = table2.id
            )
UPDATE cte
SET newcol = newcol_value
;

我的猜测是你希望这会改善某个地方的表现,但你现在需要维护这个新专栏,这会让你以其他方式付出代价。

nb:首先测试它,备份等等

答案 1 :(得分:0)

以下代码有效:

update dbo.MyContacts 
   set StateAbbreviation = S.StateAbbreviation
  from dbo.MyContacts C
inner
  join States S
    on C.State = S.StateId

答案 2 :(得分:0)

正确的语法应该是:

update c
   set StateAbbreviation = S.StateAbbreviation
   from dbo.MyContacts C inner join
        States S
        on C.State = S.StateId;

请注意使用update的别名。如果使用表名,则表中的所有行都将使用任意值进行更新,因为正在更新的表与FROM子句中引用的表之间没有链接。