简体   繁体   中英

DB2 - SQL UPDATE statement using JOINS and SELECT statement

Morning,

I'm running the following SELECT statement on a DB2 server (IBM Power System) and it returns the latest record from tableB based on a Timestamp (all good).

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          

I now need to change this statement to update tableA and set field SPRTXT01 = '0/9', but only if tableB.SRVRSP= 'SUCCESSFUL' ie the latest record from tableB has a response of 'SUCCESSFUL'.

But I don't know how to format this statement correctly. Can anyone assist please?

I've tried the below, but this updated ALL rows in the table

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)         

and I don't think it's applying the selection correctly ie rather than selecting the latest record from table B and then applying the RVSRP = 'SUCCESSFUL' check, it is only selecting the latest record for table B where SRVSRP = 'SUCCESSFUL'.

Thanks

Try this:

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

fiddle

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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