繁体   English   中英

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

[英]DB2 - SQL UPDATE statement using JOINS and SELECT statement

早晨,

我在 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 并设置字段 SPRTXT01 = '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'。

谢谢

试试这个:

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;  
NPROD SPRTXT01
5520 0/9
XXXX

小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM