Sql update avec alias

Résolu
Bonjour,
Voila j'ai une table qu'on va appelé TB
Dedans j'ai un ligne param1, param2, param3, param4
je voudrais faire un update de TB quand tb1.param1=tb2.param1, tb1.param2=tb2.param2 et set tb1.param3=tb2.param3 quand tb2.param4=val1 et tb1.param=val2
Le problème est qu'on peut pas faire d'alias sur un update et que je travail sur une seule table.
Configuration: Windows XP
Firefox 3.5.6

25 réponses

Résumé de la discussion

La problématique porte sur la mise à jour d'une table en reliant des colonnes entre lignes et en affectant param3 lorsque des valeurs correspondantes existent, tout en supposant l'absence d'alias dans UPDATE. Des réponses préconisent MERGE INTO sur la table (t1 et t2) avec ON et WHEN MATCHED THEN UPDATE pour propager des valeurs entre lignes lorsque les colonnes concordent. Concrètement, il faut aligner t1 et t2 via des colonnes clés et restreindre l'update à RO et RC lorsque t2.ref_risque est différent de t1.ref_risque et que les conditions sur les autres colonnes sont satisfaites. En pratique, cette approche est efficace même sans clé primaire, mais il faut tester selon l'environnement (Oracle) et essayer les outils adaptés comme la syntaxe MERGE.

Bobot (l’IA à votre service)
  1. merci déjà d'avoir essayé et passé du temps dessus
    @+ (je vais pouvoir partir du taf sur une victoire)
    1. j'ai trouvé, ptn c'était chaud mais voila

      merge into couverture_tiers t1
      using couverture_tiers t2 on (t2.ref_individu=t1.ref_individu and t1.ref_couv_soc=t2.ref_couv_soc)
      WHEN MATCHED THEN
      update set t1.ref_risque=t2.ref_risque
      where (t2.type_organisme='RO' and t1.type_organisme='RC')
      and t2.ref_risque<>t1.ref_risque

      il a fallut en lire de formum pour découvrir ce merge into qui est assez géniale et qui va m'aider énormément (car on a une base un peu bizarre avec notament pas vraiment de clé primaire)
      1. la requête que tu viens de me fournir ne fonctionne pas du tout (message d'erreur): identificateur de longueur zéro interdit)
        en fait pour t'expliquer un peu "le métier"
        pour une couverture sociale (ref_couv_soc) il peut y avoir plusieurs patient (donc on teste que c'est bien la couverture d'un patient)
        cette couverture se décompose en plusieures lignes
        une ligne RO et une ligne RC
        il faut que la ref_risque de la ligne RO et la ligne RC soit identique
        donc le soucis est bien de forcer un ligne avec la valeur de l'autre si elle est différente.
        je sais pas si je suis clair.
        1. petite question:

          SELECT ct1.ref_couv_soc FROM couverture_tiers ct1, couverture_tiers ct2
          WHERE ct1.ref_individu = ct2.ref_individu
          AND ct1.ref_couv_soc = ct2.ref_couv_soc cette ligne te sert juste a renvoyé les enregistrement non nul
          AND ct1.ref_risque <> ct2.ref_risque ??? dc la plus aucun resulat
          AND ct1.type_organisme ='RO'
          AND ct2.type_organisme ='RC'

          explique moi la <> entre ta requete et celle ci stp:

          SELECT ref_couv_soc FROM couverture_tiers
          WHERE ref_individu <> ""
          AND ref_couv_soc <>""
          AND type_organisme ='RO' or type_organisme ='RC'
          1. je suis en train de charcher aussi de mon coté pourquoi ca ne fonctionne pas
            1. je trouve vraiment pas
              1. Salut Clément,

                As-tu tjrs ce problème ? j'y étais moi aussi confronté et je viens de trouver la soluce donc si ça t'intéresse fait moi signe.

                @+

                ______
                Dert72
                ______
            2. la pas contre j'ai un message d'erreur: SQL command not properly ended
              1. SELECT ref_couv_soc FROM couverture_tiers as ct2
                WHERE ref_individu = ct2.ref_individu
                AND ref_couv_soc = ct2.ref_couv_soc
                AND ref_risque <> ct2.ref_risque
                AND type_organisme ='RO'
                AND ct2.type_organisme ='RC'
                1. je maitrise pas bien les AS je vais chercher la dessus.
                  1. c'est un progiciel métier particulier avec leur console pour les requête, je viens de l'essayé dans sql developpeur avec toujours 0 résultats. je crois bien être obligé d'utiliser deux alias pour celle-là.
                    1. ca ne marche pas la requête select écrit comme ça, pas de message d'erreur mais elle ne renvois rien
                      1. cette requête d'interrogation marche très bien, par contre quand je veux updater les lignes en forçant la ref_risque de la ligne RO sur la RC je ne peux pas car un update ne contionne pas en appelent la même table sous 2 alias, je ne vois pas comment l'ecrire avec un seul alias
                        1. Quel est ton message d 'erreur cette requete as deja fonctionné?
                          ds un 1er tps je te conseille de n'utiliser qu'un seul allias

                          SELECT ref_couv_soc FROM couverture_tiers ct2
                          WHERE ref_individu = ct2.ref_individu
                          AND ref_couv_soc = ct2.ref_couv_soc
                          AND ref_risque <> ct2.ref_risque
                          AND type_organisme ='RO'
                          AND ct2.type_organisme ='RC'
                          • 1
                          • 2