Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/05/2011, 16h27   #1
Membre régulier
 
Avatar de hammag
 
Inscription : février 2006
Messages : 477
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 477
Points : 94
Points : 94
Par défaut sql mettre à jour d'une table à partir d'une autre table

Bonjour tout le monde,
Quelqu’un pourrait-il m’aider pour développer la requête suivante :
J’ai deux tables : tab1 et tab2 qui ont la même structure (clés et champs)
Tab1(clé1,clé2, champ1, champ2 …)
Tab2(clé1,clé2, champ1, champ2 …)
Je cherche à mettre à jour des champs de tab2 à partir de tab1, le but de la requête est :
Si une ligne dans la table tab1 existe dans la table tab2 alors
Mettre à jour trois champs de la table tab2 avec les valeurs de ces mêmes champs à partir de tab1.
J’ai essayé cette requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
  UPDATE tab2 B, tab1 A 
  SET   B.champ1 = A.champ1,
		B.champ1 = A.champ1,
		B.champ1 = A.champ1,	
WHERE  
   AND A.cle1 = B.cle1
   AND A.cle2 = B.cle2
   AND (A.cle1 ,A.cle2) IN ( SELECT B.cle1 ,B.cle2
			FROM tab2 B
 
			)
je ne suis pas sûr si la requête est correcte

merci d'avance
hammag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 16h45   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
je ne suis pas sûr si la requête est correcte
As tu testé cette requête ? parce que si oracle te renvoie un message d'erreur c'est déjà une bonne piste

Pour ton besoin il est plus simple d'utiliser MERGE si tu es en 10G+ (quelle est la version d'oracle ?)
Quelque chose comme :
Code :
1
2
3
4
5
6
7
merge INTO tab2 b
USING tab1 a
   ON (b.cle1 = a.cle1 AND b.cle2 = a.cle2)
 when matched then
  SET b.c1 = a.c1,
      b.c2 = a.c2,
      b.c3 = a.c3
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 16h51   #3
Membre régulier
 
Avatar de hammag
 
Inscription : février 2006
Messages : 477
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 477
Points : 94
Points : 94
ce ma parait une bonne solution, sauf que ma version d'oracle est 9.
hammag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 17h51   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Dommage, alors comme ça :
Code :
1
2
3
4
5
6
UPDATE tab2 b
   SET (b.c1, b.c2, b.c3) = (SELECT a.c1, a.c2, a.c3 FROM tab2 a WHERE a.cle1 = b.cle1 AND a.cle2 = b.cle2)
 WHERE EXISTS (SELECT 1 
                 FROM tab2 a
                WHERE a.cle1 = b.cle1 
                  AND a.cle2 = b.cle2)
Ou la version rarement utilisé à base d'INLINE VIEW que je maîtrise mal, mais qui sera plus performante car on ne passe qu'une fois sur tab1 :
Code :
1
2
3
4
5
6
UPDATE (SELECT b.c1,b.c2,b.c3,a.c1,a.c2,a.c3
          FROM tab2 b
          JOIN tab1 a ON b.cle1 = a.cle1 AND b.cle2 = a.cle2)
   SET b.c1 = a.c1,
       b.c2 = a.c2,
       b.c3 = a.c3
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 18h11   #5
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 263
Points : 3 263
Citation:
Envoyé par skuatamad Voir le message
Pour ton besoin il est plus simple d'utiliser MERGE si tu es en 10G+
Pas de souci, le MERGE existe parfaitement en V9 !
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 18h25   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Oui mais en 9i il faut impérativement utiliser la clause when not matched qui empêche MERGE d'être utilisé en remplacement d'UPDATE, mais il est vrai que ça ne génera peut être pas hammag
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 22h18   #7
Membre régulier
 
Avatar de hammag
 
Inscription : février 2006
Messages : 477
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 477
Points : 94
Points : 94
ce que je comprends de ton post skuatamad, c'est qu'il faut utiliser le when not matched sous oracle 9i ?
hammag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 16h56   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 438
Points : 10 438
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Oui c'est ça, mais pour être sûr de ne faire que des UPDATE, on joue avec le USING :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 MERGE INTO tab2 b
 USING (SELECT d.*  -- à remplacer par vos colonnes
          FROM tab1 d
         WHERE EXISTS (SELECT NULL FROM tab2 c
                        WHERE c.cle1 = d.cle1
                          AND c.cle2 = d.cle2)) a
    ON (b.cle1 = a.cle1 AND b.cle2 = a.cle2)
  WHEN MATCHED THEN UPDATE
   SET b.c1 = a.c1
     , b.c2 = a.c2
     , b.c3 = a.c3
  WHEN NOT MATCHED THEN
INSERT (cle1)
VALUES (NULL);
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h28.


 
 
 
 
Partenaires

Hébergement Web