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')