首页 > 解决方案 > 根据另一个表上的字段长度更新

问题描述

我需要根据另一个表中的列数据长度更新表中的列。

表:

SOURCE:
Item_Group    Name
------------|-----------
1000        | Joe
1001        | Jill
1002        | Joanna
222222      | James
333333      | John

DESTINATION: 
Item        | Group     | Person
------------|-----------|----
1000        | 000001    |
1001        | 000002    |
9998        | 222222    |
9999        | 333333    |


UPDATED DESTINATION: 
Item        | Group     | Person
------------|-----------|----
1000        | 000001    | Joe
1001        | 000002    | Jill
9998        | 222222    | James
9999        | 333333    | John

更新应该基于Item_Group的数据长度。如果 datalength 为 4 则应根据 Item 进行更新,如果 datalength 为 6 则应根据 Group 进行更新。

我有两个单独的查询,我相信它们可以发挥作用。

UPDATE table_dest
SET Person = a.Name
FROM table_source a, table_dest b
WHERE a.Item_Group = b.Item
AND DATALENGTH(a.Item_Group) = 4
GO

UPDATE table_dest 
SET Person = a.Name
FROM table_source a, table_dest b
WHERE a.Item_Group = b.Group
AND DATALENGTH(a.Item_Group) = 6
GO

这是如何在单个查询中完成的?

标签: sqlsql-serverswitch-statementsql-updatecase

解决方案


您可以使用apply

UPDATE dt 
     SET dt.Person = s.Name
FROM table_dest dt CROSS APPLY
     ( VALUES (dt.Item), (dt.[Group]) 
     ) dtt(ItemGroup) INNER JOIN
     table_source s
     ON s.Item_Group = dtt.ItemGroup;

推荐阅读