sql - 根据另一个表上的字段长度更新
问题描述
我需要根据另一个表中的列数据长度更新表中的列。
表:
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
这是如何在单个查询中完成的?
解决方案
您可以使用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;
推荐阅读
- android - 如果文件已经存在,则让 ACTION_CREATE_DOCUMENT 覆盖文件,而不是附加 (n)
- jquery - Bootstrap 4 TempusDominus 不会应用格式
- r - 基于重复百分比从二进制数据帧中检测和提取名称
- python - 如何在pygame的窗口中绘制按钮
- azure - VerifyUserTokenAsync() 因目的而失败:用户 XXXX1145-8bcb-48d6-b8a8-dcb75955b738 的 EmailConfirmation
- apache - 无法启用 Apache 服务器的 mpmstats 日志
- c# - 如果任务的回调获取对实例本身的引用,实例是否会被垃圾收集?
- excel - 扫描下一个条形码时取消突出显示单元格
- gruntjs - grunt + bower 任务给出致命错误:Unexpected token {
- angular - 为什么在服务器关闭时无法在 Angular 中捕获 HTTP 错误?