Sql update avec alias
RésoluVoila 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
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.
-
merci déjà d'avoir essayé et passé du temps dessus
@+ (je vais pouvoir partir du taf sur une victoire) -
et bien bravo je t aurais pas aidé dsl !!!!
-
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) -
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. -
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' -
je suis en train de charcher aussi de mon coté pourquoi ca ne fonctionne pas
-
je trouve vraiment pas
-
dc pas besoin de as!!!
-
la pas contre j'ai un message d'erreur: SQL command not properly ended
-
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' -
je maitrise pas bien les AS je vais chercher la dessus.
-
je connais pas oracle!!
pas besoin de mettre de AS c implicite? -
je suis sous oracle, ça vient surement de ça
-
si tu veux je test de mon coté sous access et un allias fonctionne!!!
-
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à.
-
tu travail sous quel programme?
-
ca ne marche pas la requête select écrit comme ça, pas de message d'erreur mais elle ne renvois rien
-
utilise n seul allias com je l'ai fais pr ta requete select
-
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
-
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