3

我想对 RDBMS 表进行批量更新(通过 JDBC 在 Java 程序中),但我不确定如何在不为每条记录编写 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)一个?

4

1 回答 1

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]
于 2013-10-08T09:10:01.777 回答