J'ai une tableA:
ID value
1 100
2 101
2 444
3 501
Aussi TableB
ID Code
1
2
Maintenant, je veux remplir col = code de la table B s'il existe ID = 2 dans la tableA. pour plusieurs valeurs, obtenez la valeur maximale. sinon le peupler avec '123'. Maintenant voici ce que j'ai utilisé:
if exists (select MAX(value) from #A where id = 2)
BEGIN
update #B
set code = (select MAX(value) from #A where id = 2)
from #A
END
ELSE
update #B
set code = 123
from #B
Je suis sûr qu'il y a un problème dans BEGIN; END ou dans IF EXIST; ELSE. Fondamentalement, je veux contourner la partie else si l'instruction select de la partie IF existe et inversement. Par exemple, si l'instruction select de IF = part est:
(select MAX(value) from #A where id = 4)
Il devrait juste remplir 123, car coz = 4 n'existent pas!
EDIT
Je veux ajouter la raison pour laquelle votre déclaration IF
ne semble pas fonctionner. Lorsque vous faites un EXISTS
sur un agrégat, il s'agira toujours de true
. Il retourne une valeur même si la ID
n'existe pas. Bien sûr, c’est NULL
, mais le retourne. Au lieu de cela, faites ceci:
if exists(select 1 from table where id = 4)
et vous obtiendrez la partie ELSE
de votre déclaration IF
.
Maintenant, voici une meilleure solution, basée sur les ensembles:
update b
set code = isnull(a.value, 123)
from #b b
left join (select id, max(value) from #a group by id) a
on b.id = a.id
where
b.id = yourid
Cela présente l'avantage de pouvoir fonctionner sur la table entière plutôt que sur des identifiants individuels.
Essaye ça:
Update TableB Set
Code = Coalesce(
(Select Max(Value)
From TableA
Where Id = b.Id), 123)
From TableB b