临时表更新

SF *_*per 11 sql t-sql sql-server temp-tables sql-update

查询:

SELECT ID, T.c.value('@Address', 'nvarchar(20)' ) as Address
INTO #TMP
FROM TABLE1
    CROSS APPLY XMLData.nodes('/Document') AS T(c)

UPDATE TABLE1
SET HomeAddress = (SELECT TOP 1 t.Address
                   FROM #TMP t
                   WHERE t.ID = ID)
Run Code Online (Sandbox Code Playgroud)

主要是,我需要将数据OUT从XML字段复制到同一个表中的普通字段.

问题:

  1. 所有记录在Table1上获取HomeAddress的原因是什么?
  2. 真的是Cursor是更新Table1上值的唯一方法吗?

HLG*_*GEM 22

UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on T1.ID = t2.HomeAddressID
and t2.HomeAddress <> t1.address
Run Code Online (Sandbox Code Playgroud)

使用联接.无需临时表或相关子查询.

如果表1是一对多的关系,那么这些是处理它的一些可能性.如果你有一个值表示一个且只有一个记录(我们的系统中有一个字段可以选择最重要的地址,那么它会通过触发器进行维护以保证唯一性),试试这个:

UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on t1.ID = t2.HomeAddressID
WHERE t1.somefield = 'somevalue'
and t2.HomeAddress <> t1.address
Run Code Online (Sandbox Code Playgroud)

如果您需要基于asome其他字段(例如最近的日期)的唯一记录,请尝试以下变体:

UPDATE T2
SET HomeAddress = t1.address
FROM TABLE2 t2
join TABLE1 t1 on t1.ID = t2.HomeAddressID
join (select id, max(somedatefield) from  table1 group by id) t3 on t3.id = t1.id
Where  t2.HomeAddress <> t1.address
Run Code Online (Sandbox Code Playgroud)

  • 如果t1.id与t2.homeaddressid有一对多的关系,则可能需要更具体地说明要使用的记录. (2认同)