各种值的SQL更新语句

时间:2013-02-03 14:20:27

标签: sql db2

我正在通过sql为as400执行包含超过200亿条记录的文件的更新。

   UPDATE "LIBRARY"/AR#RMTPRL9 
   SET SENTFLAG = ' ', DATESENT = '0001-01-01', TIMESENT = '00:00:00', XMITT# = 0, LOCATION = 'PACI175A', ARBATCH# = ' ‘ 
   WHERE LOCATION = 'PACI173A' AND ARBATCH# = 'PAR1981181'

如何在单个查询中为不同的arbatch#值运行此更新以节省时间?

例如:我想对ARBATCH#值使用相同的更新语句PAR19811284,PAR18736765等。

重新编辑:

我有以下数据:(将这些值移动到位置EFG)

  LOCATION     ARBATCH#
  ABC          1234
  ABC          5468
  ABC          8765
  XYZ          6759
  XYZ          5432

这里我想实现一个查询,它将执行记录更新,如下所示:

 UPDATE "LIBRARY"/AR#RMTPRL9 
   SET SENTFLAG = ' ', DATESENT = '0001-01-01', TIMESENT = '00:00:00', XMITT# = 0, LOCATION = 'EFG', ARBATCH# = ' ‘ 
   WHERE LOCATION = 'ABC' AND ARBATCH# = '1234'

现在我怎么能成功地使用“in”进行这样的更新

2 个答案:

答案 0 :(得分:0)

您可以使用in

   UPDATE "LIBRARY"/AR#RMTPRL9 
   SET SENTFLAG = ' ', DATESENT = '0001-01-01', 
   TIMESENT = '00:00:00', XMITT# = 0, LOCATION = 'PACI175A', ARBATCH# = ' ' 
   WHERE LOCATION = 'PACI173A' AND ARBATCH# IN( 'PAR1981181', PAR18736765 etc ...)

答案 1 :(得分:0)

你可以非常轻易地“欺骗”:

UPDATE "LIBRARY"/AR#RMTPRL9 
SET SENTFLAG = ' ', 
    DATESENT = '0001-01-01', TIMESENT = '00:00:00', 
    XMITT# = 0, 
    LOCATION = 'EFG', 
    ARBATCH# = ' ' 
WHERE (LOCATION, ARBATCH#) IN (VALUES ('ABC', '1234'),
                                      ('ABC', '5468'),
                                      ('ABC', '8765'),
                                      ('XYZ', '6759'),
                                      ('XYZ', '5432'))

(语句在我的本地iSeries DB2实例上运行)

很明显,DATESENTTIMESENT应合并为一个时间戳,并且可能也可以为空。我个人更喜欢sentAt这样的名字,而不是列的类型。