2012-06-12 3 views
0

J'ai une liste de 3k ID dans le fichier texte. Je devrais trouver des rangées avec ces identifiants et les mettre à jour. j'attendre à travailler quelque chose commeMise à jour DB2 z/OS par liste

WITH RECORD_ID 
(ID) AS (
'12345', 
... 
'32134') 
UPDATE MY_TABLE T 
SET T.NAME = REPLACE(T.NAME, X'03', '') 
WHERE EXISTS (SELECT 1 FROM RECORD_ID R WHERE R.ID = T.ID); 

Mais cela ne fonctionne pas. Une idée?

+0

"Ne fonctionne pas" comment? Je ne suis pas familier avec la version de z-os, mais le CTE ne semble pas être valide dans mon i-os DB2. Si vous construisez un CTE, pourquoi ne pas simplement mettre la liste des ID dans une clause 'IN (...)'? –

+0

Je pensais que IN serait très lent si vous avez une liste de 3000 enregistrements. Et recherché pour une mise à jour plus rapide. – Ruslan

Répondre

0

Vous ne pouvez pas avoir juste une liste de valeurs dans un CTE dans DB2, vous devez UNION ALL les valeurs ensemble:

WITH RECORD_ID (ID) AS (
    SELECT '12345' FROM SYSIBM.SYSDUMMY1 UNION ALL 
    -- ... 
    SELECT '32134' FROM SYSIBM.SYSDUMMY1 
) 
UPDATE MY_TABLE T 
SET T.NAME = REPLACE(T.NAME, X'03', '') 
WHERE EXISTS (SELECT 1 FROM RECORD_ID R WHERE R.ID = T.ID); 

devrait fonctionner.

Je suis d'accord avec @ X-Zero, bien que ... il semble qu'une liste de valeurs dans une clause IN serait plus appropriée, sauf s'il y a une raison particulière pour laquelle vous voulez utiliser le CTE.