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 :

Joindre 2 tables en une seule


Sujet :

Langage SQL

  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut Joindre 2 tables en une seule
    Bonjour,

    je cherches une manière de joindre 2 tables dans la première...

    Voici ma première table :

    A (id (increment), Acol1, Acol2, Acol3, Bcol1, Bcol2, Bcol3)
    Bcol<x> étant nul pour l'instant mais accueilleront les données de B


    Et ma seconde table :
    B (Bcol1, Bcol2, Bcol3)


    J'aimerais donc (par un update), faire un update "ligne à ligne" de B sur A. Mon souci étant bien sûr que je n'ai aucun critère de jointure

    Si je fais un update tout bête sans le critère, j'aurais la première ligne de B associée à toutes les lignes de A, or ce n'est pas ce que je veux.

    Exemple :

    Au départ :
    A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id           Acol1 Acol2 Acol3 Bcol1        Bcol2        Bcol3        
    ------------ ----- ----- ----- ------------ ------------ ------------ 
             100 val1  val2  val3          NULL         NULL         NULL 
             101 val4  val5  val6          NULL         NULL         NULL
    B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Bcol1 Bcol2 Bcol3 
    ----- ----- ----- 
    B10   B11   B12   
    B20   B21   B22
    Ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id           Acol1 Acol2 Acol3 Bcol1 Bcol2 Bcol3 
    ------------ ----- ----- ----- ----- ----- ----- 
             100 val1  val2  val3  B10   B11   B12   
             101 val4  val5  val6  B10   B11   B12
    Ce que j'aimerais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id           Acol1 Acol2 Acol3 Bcol1 Bcol2 Bcol3 
    ------------ ----- ----- ----- ----- ----- ----- 
             100 val1  val2  val3  B10   B11   B12   
             101 val4  val5  val6  B20   B21   B22

    Y-a-t-il moyen de faire ça en un seul update?

    Mon SGBD est Sybase.



  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 879
    Points : 53 057
    Points
    53 057
    Billets dans le blog
    6
    Par défaut
    Mon souci étant bien sûr que je n'ai aucun critère de jointure
    sans critère de jointure, faire ce que vous demandez n'a aucun sens. Autant faire un UDPATE au hasard !

    Une base de données ce conçoit à partir d'un modèle de données. Il existe des règles à respecter. Sans le respect de ces règles que pouvez-vous espérer faire de bon ? Imaginez un maçon qui monterait un mur tordu, incliné... Comment par magie le mettre d'aplomb ?

    A +

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,

    je me doutes bien qu'il faut un critère de jointure... C'est là d'ailleurs toute ma question... Comment faire pour en créer un "proprement" (en me basant sur le champ A.id) ?

    Les données de la table B sont temporaires et aucun moyen de trouver de conditions de jointures...

    [edit] Pour répondre plus précisément à SQLPro :
    imaginons que j'ai une étagère devant moi avec des emplacements pleins et libres, je souhaites mettre chacun des jouets (table A) dans un emplacement libre de l'étagère (table B) et donc ne pas tous les entasser dans le même emplacement.

    Ca résume bien mon souci

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Ca veut dire que vous vous moquez de l'ordre d'insertion.
    Par exemple si au final vous avez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id           Acol1 Acol2 Acol3 Bcol1 Bcol2 Bcol3 
    ------------ ----- ----- ----- ----- ----- ----- 
             100 val1  val2  val3  B20   B21   B22   
             101 val4  val5  val6  B10   B11   B12
    Est-ce que ce serait juste également ?

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Tout à fait, désolé de ne pas l'avoir stipulé auparavant

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Si vous ajoutez un identifiant bidon auto-incrémenté à la table B, vous pourrez faire une jointure sur cet identifiant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ALTER TABLE B
    ADD COLUMN id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;
     
    UPDATE A
    INNER JOIN B ON A.id = B.id
    SET A.BCol1 = B.BCol1,
      A.BCol2 = B.BCol2,
      A.BCol3 = B.BCol3
    A essayer.

  7. #7
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Salut CinePhil,

    cela marchera la première fois, cependant, admettons que j'efface le contenu de ma table A et que je réinsère des données, le premier ID ne sera pas 1 (ou 0), mais le dernier ID inséré et donc la jointure ne se fera pas


    ++

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Je ne suis pas assez callé en syntaxe Sybase, mais la solution viendrait d'une jointure entre le numéro de ligne du select de la table A et le numéro de ligne du select de la table B, avec une fonction similaire à row_number.

    Mais que faire s'il y a plus de lignes dans B que dans A ? Et réciproquement.

    Comme SQLPro, je pense qu'il y a un problème de modélisation, vous ne voulez pas nous dire ce que vous essayez de faire ?

  9. #9
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Ce que je tentes de faire vient de mon edit :

    [edit] Pour répondre plus précisément à SQLPro :
    imaginons que j'ai une étagère devant moi avec des emplacements pleins et libres, je souhaites mettre chacun des jouets (table A) dans un emplacement libre de l'étagère (table B) et donc ne pas tous les entasser dans le même emplacement.
    Pour l'emplacement, je sais juste s'il est vide ou plein et aucune autre information complémentaire...


    Concernant la jointure sur les numéros de lignes, j'y avais déjà pensé mais ça semble impossible en Sybase (ASE) car il n'y pas de méthode qui retourne le ROWID



  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Si ça ne te dérange pas de remplir des tables temporaires, tu peux reconstruire l'association en partant de l'idée des auto-incréments
    :
    table tmp1(id(autoincrémenté), idext)
    table tmp2(id(autoincrémenté), b1, b2, b3)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    truncate table tmp1;
    truncate table tmp2;
     
    INSERT INTO tmp1(idext) SELECT id FROM tableA ORDER BY id;
    INSERT INTO tmp2(b1, b2, b3) SELECT b1, b2, b3 from tableB;
     
    UDPATE tableA a
    SET (b1, b2, b3) = (SELECT b1, b2, b3 
    		FROM tmp1 JOIN tmp2 
    		ON tmp1.id = tmp2.id 
    		AND tmp2.idext = a.id)
    Bon, si t'as pas le droit à la syntaxe d'update, il faut que tu répètes le trois fois (b1 = ..., b2=...)

    Sinon, j'ai encore une autre idée, mais ça va mettre ton SGBD sur les genoux !

  11. #11
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour pacmann,

    cette syntaxe -- set (b1,b2,b3) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UDPATE tableA a
    SET (b1, b2, b3) = (SELECT b1, b2, b3 
    		FROM tmp1 JOIN tmp2 
    		ON tmp1.id = tmp2.id 
    		AND tmp2.idext = a.id)
    n'est malheureusement pas tolérée en Sybase

    ++

  12. #12
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ben dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    UDPATE tableA a
    SET b1 = (SELECT b1
    	FROM tmp1 JOIN tmp2 
    	ON tmp1.id = tmp2.id 
    	AND tmp2.idext = a.id), 
          b2 = (SELECT b2
    	FROM tmp1 JOIN tmp2 
    	ON tmp1.id = tmp2.id 
    	AND tmp2.idext = a.id), 
          b3 = (SELECT b3
    	FROM tmp1 JOIN tmp2 
    	ON tmp1.id = tmp2.id 
    	AND tmp2.idext = a.id)
    ?

  13. #13
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    la méthode est la bonne

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

Discussions similaires

  1. (Performance) Deux tables ou une seule?
    Par Norin dans le forum Access
    Réponses: 26
    Dernier message: 24/06/2006, 20h43
  2. Lier trois tables dans une seule requête ?
    Par tempirate dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/06/2006, 19h27
  3. Réponses: 4
    Dernier message: 08/06/2006, 20h06
  4. plusieurs tables dans une seule table
    Par scully2501 dans le forum Access
    Réponses: 1
    Dernier message: 10/10/2005, 09h19
  5. plusieurs petite tables ou une seule grande table
    Par aaronw dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 19/05/2005, 09h22

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