2009-02-19 3 views
2

J'essaie de mettre à jour une colonne dans la table a en fonction de si une colonne différente dans la table est dans un ensemble de résultats de la table b. Actuellement, les variantes de:Vérifiez s'il existe dans l'instruction SQL CASE

update a 
set a.field1 = 
case 
when exists (
    select b.field2 
    from b 
    where b.field2 = a.field2 
) 
then 'FOO' 
else 'BAR' 
end 

ne sont pas en cours d'exécution. Des idées pour faire cela pour une base de données DB2?

Modifier: Merci pour vos réponses, mieux que je peux faire est

update a set field1 = 'FOO' where field2 in (select field2 from b); 

update a set field1 = 'BAR' where field2 not in (select field2 from b); 

Mais je vais laisser cette personne ouverte en cas peut trouver une version du code en haut qui fonctionne.

Répondre

3

Cela fonctionne dans SQL Server. Peut-être que DB2 a une construction similaire.

update a SET field1 = 'BAR' 
from a 
    left outer join b on b.field1 = a.field1 
where b.field1 is null; 
update a SET field1 = 'FOO' 
from a 
    inner join b on b.field1 = a.field1 

Cordialement,
Lieven

+0

Wow ... saintes mises à jour inutiles Batman! –

+0

@Tom. Cela devrait le réparer. –

+0

Cela fera l'affaire. Vous pouvez toujours le mettre dans une instruction de mise à jour avec une instruction CASE vérifiant les valeurs NULL dans le PK de la table B, mais il peut également être avantageux de le faire en deux étapes et ce que vous avez éliminé les mises à jour en double. –

0

La première occurence de a.field1 devrait être a.field2.

Vous avez dit « si une autre colonne dans la table est un ensemble ... »

Votre code modifie la même colonne, et non pas une autre colonne.

0

Je ne suis pas un expert sur SQL ou DB2 mais peut-être vous pouvez joindre les deux tables et vérifier si b.field1 est null?

update a 
set a.field1 = case when b.field1 is not null then 'FOO' else 'BAR' end 
from a full outer join b on a.field1 = b.field1 
+0

Vous souhaitez probablement utiliser une jointure gauche gauche plutôt qu'une jointure complète externe –

6

Je travaille sur une boîte DB2 for iSeries. Essayez ceci:

update a 
set a.field1 = 
Coalesce((select 'FOO' 
      from b 
      where b.field2 = a.field2), 
         'BAR') 

Coalesce() est une fonction qui renvoie le premier non NULL dans la liste.