使用来自其他平面表的数据的 SQL 更新行
Posted
技术标签:
【中文标题】使用来自其他平面表的数据的 SQL 更新行【英文标题】:SQL Update row with data from other flat table 【发布时间】:2019-06-25 15:02:56 【问题描述】:我有两个表:Assets 和 Values
资产
unid|name|memory|brand|type|status|processor|supplier|hostname|building|datebought|user
---------------------------------------------------------------------------------------
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|Object1|null|null|null|null|null|null|null|null|null|null
2FFA7056-4C9B-4375-B14F-4A927A55BA0C|Object2|null|null|null|null|null|null|null|null|null|null
价值观
assetid|fieldname|textvalue
---------------------------
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|memory|16
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|brand|09e9a777-3899-48ed-a1e8-d50e4469e157
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|type|0261f606-1253-41d3-9b17-4464763bb187
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|status|4dde3e20-da2d-4e1e-a9d4-51039b74e6ca
2FFA7056-4C9B-4375-B14F-4A927A55BA0C|datebought|2017-11-20T23:00:00.000
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|processor|0536f0c2-46f3-4245-b8e8-41e092e03e44
2FFA7056-4C9B-4375-B14F-4A927A55BA0C|type|7380b254-6b40-42b8-9584-a16e6f14409e
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|supplier|c3ee564a-3a46-546f-82e4-7b42f21ec841
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|hostname|object1
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|building|0536f0c2-46f3-9995-b8e8-41e092e03e44
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|datebought|2017-06-14T22:00:00.000
D7930C14-3196-49DA-BAC9-9D03F5FA9E8F|user|ac2d9a93-f09c-5d13-bd78-7e3ba2a749e6
2FFA7056-4C9B-4375-B14F-4A927A55BA0C|brand|09e9a777-3899-48ed-a1e8-d50e4469e157
2FFA7056-4C9B-4375-B14F-4A927A55BA0C|supplier|c3ee564a-3a46-546f-82e4-7b42f21ec841
2FFA7056-4C9B-4375-B14F-4A927A55BA0C|status|4dde3e20-da2d-4e1e-a9d4-51039b74e6ca
如您所见,表 Assets 的行中有很多空值。该空值需要使用表 Values 中的值填充。
这对我来说很难,因为表 Value 中的每个值都在单独的行中。因此,Values 中的多行需要更新为 Assets 中单行中的列。
两个表之间的关系是 Assets.unid = Values.assetid
我尝试使用如下所示的数据透视表,但我仍然不知道如何将数据更新到相应的行。
select "memory", "brand", "type", "status", "processor", "supplier", "hostname", "building", "datebought", "user"
from
(
select cast(textvalue as varchar(max)) as textvalue, fieldname
from am_value
) d
pivot
(
max(textvalue)
for fieldname in ("memory", "brand", "type", "status", "processor", "supplier", "hostname", "building", "datebought", "user" )
) piv
【问题讨论】:
【参考方案1】:您好,首先我们将使用以下查询形成透视结果集
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(fieldname)
from Values
GROUP BY fieldname
order by 1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT assetid ,' + @cols + ' into #temp from
(
select *
from values
) x
pivot
(
max(textvalue)
for COL in (' + @cols + ')
) p '
execute(@query);
现在您可以使用 temp# 中的值更新您的表格
【讨论】:
以上是关于使用来自其他平面表的数据的 SQL 更新行的主要内容,如果未能解决你的问题,请参考以下文章