Sql server 2012 使用sql server 2012中的联接条件,使用来自其他表的多行数据更新一个表的每一行
临时预算:Sql server 2012 使用sql server 2012中的联接条件,使用来自其他表的多行数据更新一个表的每一行,sql-server-2012,Sql Server 2012,临时预算: batteryid | batname | batt01 | batt02 | batt03 | batt04 ----------+---------+---------+--------+---------+-------- 01 | trixon | null | null | null | null 03 | jaguarv | null | null | null | null tempA中的最终输出应如下
batteryid | batname | batt01 | batt02 | batt03 | batt04
----------+---------+---------+--------+---------+--------
01 | trixon | null | null | null | null
03 | jaguarv | null | null | null | null
tempA中的最终输出应如下所示:
batteryid | load
-----------+---------
01 | 14.58
01 | 58.12
01 | 16.89
03 | 25.47
03 | 87.65
上面的代码使用while循环通过连接batteryid和tempB表的batteryid来更新tempA表
谢谢您可以不用在SQL Server中使用
PIVOT
,也可以不用循环和更新语句
batteryid | batname | batt01 | batt02 | batt03 | batt04
----------|----------|----------|--------|---------|--------------
01 | trixon | 14.58 | 58.12 | 16.89 | null
03 | jaguarv | 25.47 | 87.65 | null | null
下面是我用来测试查询的代码
SELECT SourceA.[batteryid],
SourceA.[batname],
SourcePivot.[1] AS 'Battery1',
SourcePivot.[2] AS 'Battery2',
SourcePivot.[3] AS 'Battery3',
SourcePivot.[4] AS 'Battery4'
FROM @tempA AS SourceA
INNER JOIN (
SELECT *
FROM
(
SELECT batteryId,
loadval,
row_number() OVER (PARTITION BY batteryid ORDER BY loadval) rn
FROM @tempB
) s
PIVOT (MIN(loadval) FOR rn IN ([1], [2], [3], [4])) pvt
) AS SourcePivot ON SourcePivot.batteryid = SourceA.batteryid
到目前为止,您做了什么?我使用while循环遍历tempB表,获取匹配的batterid,并在第一个表列(如batt01)中更新tempB的列值。While循环执行15000条记录需要更长的时间。向我们展示代码,我们将从那里开始。非常感谢@kane。我在tempA中有一个问题列,如batt01、batt02、batt03,它们不是固定的,它们根据计数而变化,并添加到tempA表中。例如:如果count是30,则添加30列,并且我必须对30列动态执行相同的更新。
SELECT SourceA.[batteryid],
SourceA.[batname],
SourcePivot.[1] AS 'Battery1',
SourcePivot.[2] AS 'Battery2',
SourcePivot.[3] AS 'Battery3',
SourcePivot.[4] AS 'Battery4'
FROM @tempA AS SourceA
INNER JOIN (
SELECT *
FROM
(
SELECT batteryId,
loadval,
row_number() OVER (PARTITION BY batteryid ORDER BY loadval) rn
FROM @tempB
) s
PIVOT (MIN(loadval) FOR rn IN ([1], [2], [3], [4])) pvt
) AS SourcePivot ON SourcePivot.batteryid = SourceA.batteryid
DECLARE @tempA TABLE (
batteryid VARCHAR(2),
batname VARCHAR(50),
batt01 DECIMAL(18, 2),
batt02 DECIMAL(18, 2),
batt03 DECIMAL(18, 2),
batt04 DECIMAL(18, 2)
)
DECLARE @tempB TABLE (
batteryid VARCHAR(2),
loadval DECIMAL(18, 2)
)
INSERT INTO @tempA (batteryid, batname) VALUES ('01', 'trixon')
INSERT INTO @tempA (batteryid, batname) VALUES ('03', 'jaguarv')
INSERT INTO @tempB VALUES ('01', '14.58')
INSERT INTO @tempB VALUES ('01', '58.12')
INSERT INTO @tempB VALUES ('01', '16.89')
INSERT INTO @tempB VALUES ('03', '25.47')
INSERT INTO @tempB VALUES ('03', '87.65')