我想对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
…
根据Type为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)?
答案 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]