使用JOINS和SELECT语句的DB2 - SQL UPDATE语句

kjthegm6  于 2022-12-13  发布在  DB2
关注(0)|答案(1)|浏览(183)

早上好,
我在DB2服务器(IBM Power System)上运行下面的SELECT语句,它根据时间戳从tableB返回最新的记录(都是正确的)。

SELECT * FROM library1/tableA         
JOIN library1/tableB on tableB.PRDCOD = tableA.NPROD      
WHERE tableB.PRDCOD = '5520' and tableA.SPRTXT01 <> '0/9'            
ORDER BY tableB.timstp DESC FETCH NEXT 1 ROWS ONLY

我现在需要更改此语句以更新tableA并设置字段SPRTXT 01 = '0/9',但前提是tableB.SRVRSP= 'SUCCESSFUL',即tableB中的最新记录具有'SUCCESSFUL'响应。
但是我不知道如何正确地编排这份声明的格式。有人能帮忙吗?
我已经尝试了下面的方法,但这会更新表中的所有行

UPDATE library1/tableA                                        
SET tableA.SPRTXT01 = '0/9'                                     
Where exists (
Select '1'                                            
FROM library1/tableA                            
JOIN library1/tableB on                          
tableB.PRDCOD = tableA.NPROD                   
WHERE tableB.PRDCOD = '5520' and tableB.SRVRSP = 'SUCCESSFUL'                             
and tableA.SPRTXT01 <> '0/1'                       
ORDER BY tableB.timstp DESC FETCH NEXT 1 ROWS ONLY)

并且我认为它没有正确地应用选择,也就是说,它没有从表B中选择最新的记录,然后应用RVSRP = 'SUCCESSFUL'检查,而是只选择了表B中SRVSRP = 'SUCCESSFUL'的最新记录。
谢谢

xpszyzbs

xpszyzbs1#

试试这个:

CREATE TABLE tableA (NPROD VARCHAR (10), SPRTXT01 VARCHAR (3));
CREATE TABLE tableB (PRDCOD VARCHAR (10), SRVRSP VARCHAR (20), timstp TIMESTAMP);

INSERT INTO tableA (NPROD, SPRTXT01)
VALUES ('5520', ''), ('XXXX', '');

INSERT INTO tableB (PRDCOD, SRVRSP, timstp)
VALUES 
  ('5520', 'SUCCESSFUL',   CURRENT TIMESTAMP)
, ('5520', 'UNSUCCESSFUL', CURRENT TIMESTAMP + 1 SECOND)
-- Comment out the next row to make it NOT update the SPRTXT01 column
, ('5520', 'SUCCESSFUL',   CURRENT TIMESTAMP + 2 SECOND)
;

UPDATE tableA                                        
SET tableA.SPRTXT01 = '0/9'                                     
Where tableA.NPROD = '5520' AND tableA.SPRTXT01 <> '0/9'
AND exists 
(
  SELECT 1 
  FROM tableB
  JOIN (SELECT PRDCOD, MAX (timstp) AS timstp FROM tableB GROUP BY PRDCOD) G
    ON (G.PRDCOD, G.timstp) = (tableB.PRDCOD, tableB.timstp)
  WHERE tableB.PRDCOD = tableA.NPROD      
    AND tableB.SRVRSP = 'SUCCESSFUL'
);
 
SELECT * FROM tableA;

| 生产|SPRTXT 01系列|
| - -|- -|
| 小行星5520| 0/9|
| XXXX年||
fiddle

相关问题