Bonjour, je dois mettre à jour un groupe d’enregistrements d’une table via une sous-requête dont le résultat ne doit pas être nul car les colonnes à mettre à jour n’acceptent pas les valeurs nulles. Jusqu’à présent, je répétais la sous-requête 2 fois : 1 fois pour obtenir un résultat, et une fois pour conditionner la mise à jour à l’existence d’un résultat. Comment éviter cette répétition ?
Exemple :
UPDATE GECOFIC.diabolo1 AS d1
SET d1.nomgroupe = (SELECT RTRIM(b.nom) concat ' ' concat RTRIM(b.prenom) FROM
gecofic.agdip01c b INNER JOIN gecofic.agstp20 a ON b.matr = a.leader WHERE a.nivstr = 3
AND a.codstr = d1.groupe AND a.typo = '' FETCH FIRST 1 ROWS ONLY)
WHERE exists (SELECT * FROM
gecofic.agdip01c b INNER JOIN gecofic.agstp20 a ON b.matr = a.leader WHERE a.nivstr = 3
AND a.codstr = d1.groupe AND a.typo = '' FETCH FIRST 1 ROWS ONLY);
Bonjour, il est également possible d’utiliser l’instruction MERGE :
MERGE INTO GSCD99ET04.EVTPART40 AS T USING ( SELECT NATURE, ID_CRIT, REQUETE_CATALOGUE FROM TESTFIC.EVTPART40 WHERE REQUETE_CATALOGUE <> ' ' ) AS S ON S.NATURE = T.NATURE AND S.ID_CRIT = T.ID_CRIT WHEN MATCHED THEN UPDATE SET T.REQUETE_CATALOGUE = S.REQUETE_CATALOGUE WITH UR;
Cette méthode combine les avantages des 2 autres méthodes : les enregistrements ne sont pas tous mis à jour si on ne trouve rien par la sous-requête (NULL à traiter) et on n’a pas à répéter 2 fois le SELECT pour éviter les valeurs nulles.
On peut créer une vue pour chaque table contenant les colonnes communes aux 2 et faire un insert * comme indiqué par Frédéric dans la 1ère réponse.