IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Mettre à jours champs depuis une autre table


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Mettre à jours champs depuis une autre table
    Bonjour tout le monde

    Voila depuis ce matin je bloque sur un truc qui peut vous paraitre tout con
    Je m'explique

    j'ai une table t1 de type suivant
    id , nom, prenom, mail ,.......

    une autre table t2 de type
    nom , prenom , mail,...... (donc sans id)

    mon but c'est de remplir les null dans la colonne mail de t1 avec la table t2.
    N'ayant pas d'id je fais une jointure avec nom et prenom.

    J'ai une requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE t1
            SET EMAIL = (select EMAIL
            from t2
    where t1.NOM = t2.NOM
    and t1.PRENOM = t2.PRENOM
    and t1.EMAIL is null);
    La requête s’exécute

    Problème au lieu de me rajouter des emails la requête me supprime presque tout
    avant dans t1 j'avais 648 mails
    après la requête j'ai plus que 3 mails :/


    Help svp

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    rajoutez une clause where a votre update.

    La si la requete n'arrive pas a faire la jointure la colonne mail sera automatiquement alimentée a null

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Ca peut ressembler à cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE tb1
    SET tb1.email = tb2.email
    FROM Table1 AS tb1
    INNER JOIN Table2 AS tb2
    	ON tb1.nom = tb2.nom
    	AND tb1.prenom = tb2.prenom
    WHERE
    	tb1.email IS NULL

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci de vos réponse

    Citation Envoyé par punkoff Voir le message
    bonjour,

    rajoutez une clause where a votre update.

    La si la requete n'arrive pas a faire la jointure la colonne mail sera automatiquement alimentée a null
    une clause where a la fin mais pour y mettre quoi ? je ne vois pas :/

    Citation Envoyé par Niklosus Voir le message
    Bonjour,

    Ca peut ressembler à cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE tb1
    SET tb1.email = tb2.email
    FROM Table1 AS tb1
    INNER JOIN Table2 AS tb2
    	ON tb1.nom = tb2.nom
    	AND tb1.prenom = tb2.prenom
    WHERE
    	tb1.email IS NULL
    Ce code me renvoie une erreur "SQL command not properly ended"


    chose que j'ai oublié de preciser
    nom,prenom dans t1 ne se trouve pas forcément dans t2 et vice versa

  5. #5
    Membre averti
    Avatar de diablo-dz
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Points : 327
    Points
    327
    Par défaut
    bonsoir
    tu peux nous dire c'est quoi ton SGBD

    Bonsoir Niklosus
    la requête qu'a proposer Niklosus marcher très bien sur sql server
    A+

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par diablo-dz Voir le message
    bonsoir
    tu peux nous dire c'est quoi ton SGBD

    Bonsoir Niklosus
    la requête qu'a proposer Niklosus marcher très bien sur sql server
    A+
    Je suis sous oracle xe 11g

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 403
    Points
    28 403
    Par défaut
    La requête proposée par Niklosus fonctionne peut-être sur SQL Serveur, mais cette syntaxe n'est pas conforme à la norme SQL.
    Celle-ci a plus de chances d'être comprise par tous les SGBD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    UPDATE  t1
      SET   email = 
            (   SELECT  email
                FROM    t2
                WHERE   t1.nom      = t2.nom
                    AND t1.prenom   = t2.prenom
                    AND t1.email    IS NULL
            )
    WHERE   EXISTS 
            (   SELECT  NULL
                FROM    t2
                WHERE   t1.nom      = t2.nom
                    AND t1.prenom   = t2.prenom
                    AND t1.email    IS NULL
            )
    ;

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Autant pour moi, j'ai été trop vite.
    Cette syntaxe ne fonctionne pas sous Oracle.

  9. #9
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci cela fonctionne

    Maintenant un autre problème se pose :/
    Comment je transfère depuis t2 les nom,prenom,email....... vers t1 sans inclure les doublons ?

    Pour palier au problème d'id inexistant dans t2 j'ai créé une sequence qui commence au max(id) de t1

    j'ai quelque chose de ce genre la mais cela ne fonctionne pas :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    insert into t1(id, col1,col2.....)
    	select seq.nextval, t2.col1,t2.col2..... 
    	from t2
    where not exists 
    	(select null 
    	from t2
    	WHERE t1.nom	= t2.nom
    	AND t1.prenom	= t2.prenom)
    J'ai un message du type t2.prenom invalid identifier

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 403
    Points
    28 403
    Par défaut
    Tu recherches les lignes qui existent dans t2 mais pas dans t1 ?
    Ce n'est pas ce que tu as écrit dans ta requête...

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Tu recherches les lignes qui existent dans t2 mais pas dans t1 ?
    Ce n'est pas ce que tu as écrit dans ta requête...
    oui je veux transferer vers t1 toute les lignes de t2 sauf celle qui existent déjà dans t1

    j'arrive a tout transferer sans problème. Mais c'est au moment de la clause where que je bloque. J'arrive pas a m'imaginer la clause en fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO t1(id, col1,col2.....)
    	SELECT seq.NEXTVAL, t2.col1,t2.col2..... 
    	FROM t2
    WHERE ...

    J'ai imaginer quelque chose comme ca mais fonctionne pas non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      insert into t1(ID_,nom,pt2nom,email,....)
        select s1.nextval, t2.NOM,t2.Pt2NOM,t2.email,t2.ID_FILIEt2,t2.ID_PROMOTION
        from t2
        where t2.nom,t2.prenom not exists (select nom,prenom from t1);

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 403
    Points
    28 403
    Par défaut
    Relis bien la requête que tu as écrite ; elle recherche dans t2 les lignes qui n'existent pas dans t2...

  13. #13
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Relis bien la requête que tu as écrite ; elle recherche dans t2 les lignes qui n'existent pas dans t2...

    ahh oui j'ai pas fait attention. En remplaçant par t1 cela fonctionne

    Merci beaucoup, ça fait 2 jours que je bloque sur ça je commençais a désespérer et a vouloir le faire manuellement !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. mettre à jour à partir d'une autre table
    Par xavier_dcf dans le forum Requêtes
    Réponses: 1
    Dernier message: 17/12/2012, 21h24
  2. [AC-2007] table liés, insertion de champs depuis une autre table
    Par moumouss dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2009, 11h44
  3. Réponses: 3
    Dernier message: 06/09/2008, 06h51
  4. Réponses: 13
    Dernier message: 14/04/2008, 14h30
  5. Réponses: 6
    Dernier message: 25/07/2007, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo