sql - 我可以构建单个批量 SQL 更新命令吗

标签 sql sql-server sql-update

我想对 RDBMS 表进行批量更新(从 Java 程序中通过 JDBC),但我不确定如何在不为每条记录编写 UPDATE 语句的情况下实现它。

这是问题的粗略概述。我有一个名为 SUBS 的表,其中包含以下列和示例数据:

ID (int), Type(bool), D1 (date), D2 (date), D3 (date)
1000, 1, 2013-08-31, 2013-10-31, 2013-10-31
1001, 0, 2013-10-31, NULL, NULL
1002, 0, 2013-11-30, NULL, NULL
…

根据类型为 0 或 1,我要么只更新 D1,要么更新 D2 和 D3。在我的程序中,我有一个数据结构,包括 ID、类型和所需的新日期 (D1-D3)。我可以轻松地遍历此数据结构并生成以下命令:

UPDATE SUBS SET D2 = “2014-01-31”, D3 = ‘2014-01-31’ WHERE ID = 1000
UPDATE SUBS SET D1 = “2013-12-31” WHERE ID = 1001
UPDATE SUBS SET D1 = “2014-01-31” WHERE ID = 1002

但是,有没有办法在单个 SQL 命令中执行此操作?或者可能是两个命令,每个类型一个(0 或 1)?

最佳答案

假设您的新数据称为 NEWSUBS,并且具有相同的表结构,那么我认为这就是您所追求的:

UPDATE S SET 
    D1 = CASE N.[Type] WHEN 0 THEN N.D1 ELSE S.D1 END,
    D2 = CASE N.[Type] WHEN 1 THEN N.D2 ELSE S.D2 END,
    D3 = CASE N.[Type] WHEN 1 THEN N.D3 ELSE S.D3 END
FROM    SUBS S
JOIN    NEWSUBS N
    ON  N.ID = S.ID
    AND N.[Type] = S.[Type]

基本上它只是用当前值更新 SUBS(即没有变化)对于应该未被感染的列

鉴于您的数据是本地的,根据评论,我能看到的唯一其他方法是构建一个 xml 参数并将其传递以进行更新,如下所示:

DECLARE @NEWSUBSXML xml

SELECT @NEWSUBSXML = '
<SUBS>
    <SUB>
        <ID>1000</ID>
        <TYPE>1</TYPE>
        <D>2014-01-31</D>
    </SUB>
    <SUB>
        <ID>1001</ID>
        <TYPE>0</TYPE>
        <D>2013-12-31</D>
    </SUB>
    <SUB>
        <ID>1002</ID>
        <TYPE>0</TYPE>
        <D>2014-01-31</D>
    </SUB>
</SUBS>' 



UPDATE S SET 
    D1 = CASE N.[Type] WHEN 0 THEN N.D ELSE S.D1 END,
    D2 = CASE N.[Type] WHEN 1 THEN N.D ELSE S.D2 END,
    D3 = CASE N.[Type] WHEN 1 THEN N.D ELSE S.D3 END
FROM    SUBS S
JOIN    
(       SELECT  ParamValues.ID.value('(ID)[1]','INT') AS [ID],
                ParamValues.ID.value('(TYPE)[1]','INT') AS [Type],
                ParamValues.ID.value('(D)[1]','DATE') AS [D]
        FROM    @NEWSUBSXML.nodes('/SUBS/SUB') as ParamValues(ID) 
) N
    ON  N.ID = S.ID
    AND N.[Type] = S.[Type]

关于sql - 我可以构建单个批量 SQL 更新命令吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19243181/

相关文章:

sql - Oracle ORA-00902 无效数据类型错误

sql - 将新值映射到 sql 查询的有效方法(即 4 列,每列具有相同的凭据)

sql - 在 SQL Server Management Studio 中将存储过程作为作业运行

sql-server - 尽管连接字符串中有 TrustServerCertificate=true,但 SSL/证书验证错误

MySql,在 DELETE 更新计数器后不包含间隙

Mysql 更新并选择最小/最大计数组

ios - 一次使用 SQL for iOS 应用程序和网页

MySQL SELECT/GROUP BY 丢失 NULL

javascript - 具有 Node mssql 对象的存储过程的受影响行

postgresql - 使用 plpgsql 更新函数中的列