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 :

Jointure externe des deux cotés


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de Braillane
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2007
    Messages : 212
    Points : 203
    Points
    203
    Par défaut Jointure externe des deux cotés
    Bonjour,
    Je cherche à faire une requete un peu bizarre. J'ai deux tables qui sont liés, chacune des deux contient des champs null. Je voudrais que lorsque je fais une requête sur la premiere je vois les champs null...
    Okay... on va faire par l'exemmple parce que la, meme moi je me comprend pas...
    table1 : table2 :
    +--------+ +--------+
    |idtable1| |idTable2|
    +--------+ +--------+
    | t21......| | t21......|
    | NULL....| | t22......|
    | tbidon..| | t23......|
    +--------+ +--------+

    Si je fais la requete :
    "SELECT idtable1,idtable2
    FROM table1
    LEFT JOIN table2 on (idtable1 = idtable2)"
    J'obtiens :
    +--------+ +--------+
    | t21......| | t21......|
    | tbidon..| | NULL....|
    +--------+ +--------+

    Mais moi je veux obtenir :
    +--------+ +--------+
    | t21......| | t21......|
    | NULL....| | NULL....|
    | tbidon..| | NULL....|
    +--------+ +--------+

    Comment puis je faire????

    PS: J'ai vraiment fait avec les moyens du bord la
    PS2: Si vous vous demandez à quoi sa sert de faire sa, j'ai envie de dire ici à rien... mais dans mon projet j'ai une requete ultra complexe qui ne peut etre optimisé qui si j'arrive à faire sa...
    thibaultdelor.com
    SCJP & SCWCD

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Un FULL OUTER JOIN inclue tous les champs des 2 tables !

    Ou une requête UNION du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT ....
    FROM T1 LEFT OUTER JOIN T2
    ON ...
     
    UNION
     
    SELECT ...
    FROM T2 LEFT OUTER JOIN T1
    ON ...
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Membre actif Avatar de Braillane
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2007
    Messages : 212
    Points : 203
    Points
    203
    Par défaut
    Hum avec ce genre de requete j'obtiendrais plutot sa :
    +--------+ +--------+
    | t21......| | t21......|
    | tbidon..| | NULL....|
    | NULL....| | t22......|
    | NULL....| | t23......|
    +--------+ +--------+
    non???????

    Tout ce qui est union ou sous requete est à proscrire dans mon cas, je ne pourrais pas l'utiliser dans le contexte réel (sois pour cause de performance, sois par ce que ce n'est pas intégrable dans ma requete finale)

    Merci de m'aider quand meme
    thibaultdelor.com
    SCJP & SCWCD

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Etes-vous sûr de vous ? Quel est votre SGBD ?
    Car sur Oracle 11g et SQL Server 2005, la requête suivante (aux "from dual" près) donne le résultat que vous attendez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH T1 AS
    (
    select 't21' id1 from dual union
    select null from dual union
    select 'tbison' from dual
    ),
     T2 AS 
    (
    select 't21' id2 from dual union
    select 't22' from dual union
    select 't23' from dual
    ) 
    SELECT id1, id2 
    FROM T1 LEFT JOIN T2 on id1 = id2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID1	ID2
    -----------------
    t21	t21
    null	null
    tbison	null

  5. #5
    Membre actif Avatar de Braillane
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2007
    Messages : 212
    Points : 203
    Points
    203
    Par défaut
    Rebonjour et merci beaucoup beaucoup pour vos réponses, ça fait plaisir de savoir que la communauté est la pour nous aider!
    Bon je vais vous reformuler mon problème car je n'ai pas du tout était clair!
    • Mon SGBD est MySQL (c'est celui de l'entreprise donc on peut pas changer)
    • J'ai créer une base de test pour mieux comprendre :
    • Mon but est d'obtenir la liste intégral des documents associés aux valeurs descripteurs dont le champ_descripteur est 1,2 ou 3. Un document = 1 lignes impérativement!
    • J'ai réussi à obtenir ce que je voulais avec des sous requetes, le problème est que ça prend beaucoup trop de temps. Voici la requete en question et son résultat :
      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
      17
      18
      19
      20
      21
      22
      23
      SELECT d.id_document, nom_document, v1.nom_valeurdescripteur, v2.nom_valeurdescripteur, v3.nom_valeurdescripteur
      FROM document d
      LEFT JOIN
      (
      	select id_document,v.id_valeurdescripteur, v.nom_valeurdescripteur
      	from documenttovaleurdescripteur dt1
      	INNER JOIN valeurdescripteur v on (dt1.id_valeurdescripteur = v.id_valeurdescripteur AND v.id_champsdescripteur = '1')
       
      ) as v1 ON (d.id_document=v1.id_document)
      LEFT JOIN
      (
      	select id_document,v.id_valeurdescripteur, v.nom_valeurdescripteur
      	from documenttovaleurdescripteur dt1
      	INNER JOIN valeurdescripteur v on (dt1.id_valeurdescripteur = v.id_valeurdescripteur AND v.id_champsdescripteur = '2')
       
      ) as v2 ON (d.id_document=v2.id_document)
      LEFT JOIN
      (
      	select id_document,v.id_valeurdescripteur, v.nom_valeurdescripteur
      	from documenttovaleurdescripteur dt1
      	INNER JOIN valeurdescripteur v on (dt1.id_valeurdescripteur = v.id_valeurdescripteur AND v.id_champsdescripteur = '3')
       
      ) as v3 ON (d.id_document=v3.id_document)

    • J'essaye actuellement de faire une requete du genre:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      select d.id_document,nom_document,v1.nom_valeurdescripteur,v2.nom_valeurdescripteur, v3.nom_valeurdescripteur
      from document d
      LEFT JOIN documenttovaleurdescripteur dt1 on (d.id_document=dt1.id_document)
      LEFT JOIN valeurdescripteur v1 on (dt1.id_valeurdescripteur = v1.id_valeurdescripteur and v1.id_champsdescripteur =1)
      LEFT JOIN documenttovaleurdescripteur dt2 on (d.id_document=dt2.id_document)
      LEFT JOIN valeurdescripteur v2 on (dt2.id_valeurdescripteur = v2.id_valeurdescripteur and v2.id_champsdescripteur =2)
      LEFT JOIN documenttovaleurdescripteur dt3 on (d.id_document=dt3.id_document)
      LEFT JOIN valeurdescripteur v3 on (dt3.id_valeurdescripteur = v3.id_valeurdescripteur and v3.id_champsdescripteur =3)


    Voila j'espère que quelqu'un aura une idée
    Merci d'avance!
    thibaultdelor.com
    SCJP & SCWCD

  6. #6
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    En fait, ce que tu veux faire, c'est de la présentation, et la présentation, ce n'est pas le travail du SGBD...

  7. #7
    Membre actif Avatar de Braillane
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2007
    Messages : 212
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par Monstros Velu Voir le message
    En fait, ce que tu veux faire, c'est de la présentation, et la présentation, ce n'est pas le travail du SGBD...
    Au contraire c'est son travail, sinon seul le seul select * from table existerait et on se débrouillerai avec.
    Donc en effet dans un sens on peut dire que je recherche un peu de présentation de la part de mysql, mais bon tout le monde cherche à avoir une certaine présentation lors de ses requete... ça ne fait pas avancé le scmilblik
    thibaultdelor.com
    SCJP & SCWCD

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous pouvez vous en sortir avec une requête sans vue / sous-requête.

    Je n'ai pas le temps de poster du code, mais faite des max (case when id_champ = 1 then nom_valeur else null end ).

    J'ai posté une requête similaire ici : http://www.developpez.net/forums/d65...e/#post3824099

  9. #9
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    Citation Envoyé par Braillane Voir le message
    Au contraire c'est son travail, sinon seul le seul select * from table existerait et on se débrouillerai avec.
    Il ne faut pas confondre la sélection des données avec un processus de mise en forme. La phase de sélection des données se fait avec le SGBD, et il est optimisé pour ça ce qui fait qu'il est tres rapide, et la phase de mise en forme se fait par le client qui utilise les données.

    Dans le cas présent, la requête devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT d.id_document, nom_document, nom_valeurdescripteur, id_champsdescripteur
    FROM document d
    LEFT JOIN documenttovaleurdescripteur dt on dt.id_document=d.id_document
    LEFT JOIN valeurdescripteur v ON (v.id_valeurdescripteur = dt.id_valeurdescripteur
    Ce qui donnerai le résultat, proprement et rapidement.

    Puis la couche de mise en forme construirait le tableau, tres rapidement aussi puisque c'est son boulot.



    Tenez, par exemple, on ajoute un id_champsdescripteur qui vaut 4. Il n'y a rien à changer : La requête reste la même, on a toujours les données. Et si la construction du tableau est bien faite, il est possible qu'il n'y ait rien à changer de ce coté là non plus.



    Pour résumer, je cite cet article (dans lequel toutefois vous trouverez la solution à ce problème) de SqlPro :
    toute opération cosmétique grève énormement les performances d'un serveur SQL parce qu'il n'a pas été prévu pour cela, alors qu'un outil de présentation spécialisement conçu à cet effet pourra donner le même rendu en minimisant les ressources.
    Et il se trouve que le problème du post initial est celui des performances.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/04/2011, 11h11
  2. jointure externe entre deux select
    Par xavier81 dans le forum Développement
    Réponses: 7
    Dernier message: 10/02/2011, 13h31
  3. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42
  4. [Oracle] Tris sur des jointure externes
    Par roychris dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/04/2006, 05h25
  5. [Oracle 8i] Jointures externes des 2 côtés
    Par yAnSoLo82 dans le forum Oracle
    Réponses: 4
    Dernier message: 23/12/2005, 11h23

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