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 :

Select multi tables sans jointure


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Select multi tables sans jointure
    Bonjour,

    J'ai fais une requête qui ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT A.id,B.id,C.id,D.id 
    from tab1 A,tab2 B,tab3 C,tab4 D
    where A.id2=valeur or B.id2 = valeur or D.id2 = valeur or D.id2 = valeur;
    mon problème c'est que lorsque les tables B,C et D sont vides et la table A contient un tuple qui vérifie la condition where, ça me renvoie vide pour id de A.

  2. #2
    Membre actif
    Inscrit en
    Janvier 2012
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 145
    Points : 226
    Points
    226
    Par défaut
    Vous utilisez une syntaxe non normalisée pour faire vos JOINtures, commencez par regarder cet article. Pour renvoyer une ligne même quand certains lignes ne sont pas trouvées dans la jointure, vous pourrez utiliser une jointure externe, le LEFT JOIN.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta réponse,mais ce que je veux faire c'est une requête sans jointure, par ce que dans mon where je mets des conditions qui ne lie pas les tables entre eux,mais concerne un champs spécifique de chaque tables.

  4. #4
    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,

    Vu que vous n'avez pas spécifié votre SGBD, ca sera à adapter !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select 
    (select id from table_a) as id_a,
    (select id from table_b) as id_b
    etc...
    Le "etc" soit à remplacer avec "from dual" (ou autre table avec 1 seule ligne) ou à ometre si ca passe tel quel

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour punkoff,

    J'utilise oracle 10g comme BDD.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Je vous explique un peu plus mon problème:
    j'ai 4 tables que je nomme A,B,C et D dans ma BDD,les tables B,C et D contiennent id de la table A comme clé étrangère.

    Dans le cas où la table A contient un tuple avec comme id_tabA=1,et la table B contient aussi un tuple avec id_tabB=4 et id_tabA = 1 comme clé étrangère,et que les autres tables sont vide.

    Quand j’exécute cette requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT B.id_tabB,C.id_tabC,D.id_tabD 
    FROM  tabB B,tabC C,tabD D
    WHERE B.id_tabA = 1 OR C.id_tabA = 1 OR D.id_tabA = 1;

    Normalement je dois recevoir comme résultat:
    id_tabB=4
    id_tabC=vide
    id_tabD=vide
    mais j'ai ce résultat:
    id_tabB=vide
    id_tabC=vide
    id_tabD=vide

  7. #7
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,

    Comme dis plus haut il faudrait déjà faire les jointures entre les tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT idA, idB, idC, idD
    FROM A
    JOIN B ON A.idA = B.idA
    JOIN C ON A.idA = C.idA
    JOIN D ON A.idA = D.idA
    WHERE idA = 1
    ~ Lola ~

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour Lola,

    j'ai essayé ta requête et voila ce que j’obtiens:
    idA=vide
    idB=vide
    idC=vide
    idD=vide

    au lieu de:
    idA=1
    idB=4
    idC=vide
    idD=vide

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Ce que je cherche à faire c'est regrouper ces 3 requêtes en une seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select idB from B where b.idA = 1;
    select idC from C where C.idA = 1;
    select idD from D where D.idA = 1;

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Il s'agit alors d'une union pas d'une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT idB FROM B WHERE b.idA = 1
    UNION
    SELECT idC FROM C WHERE C.idA = 1
    UNION
    SELECT idD FROM D WHERE D.idA = 1;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  11. #11
    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,


    regardez du côté des jointures externe : http://sqlpro.developpez.com/cours/sqlaz/jointures/

    la syntaxe sera presque identique que celle proposée par lola06

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    @al1_24

    J'ai essayé ta requête,elle marche mais le problème c'est que j'ai ce résultat:
    idB=4
    et moi j'ai besoin de :
    idB=4
    idC=vide
    idD=vide

    pour pouvoir initialiser des variable php lorsque j’exécute ma requête avec oci_excute et oci_fetch.

    @punkoff

    J'ai essayé les jointures externes sans succès.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Citation Envoyé par yassino01 Voir le message
    J'ai essayé les jointures externes sans succès.
    Pourtant de ce que je comprends du problème, ça doit marcher:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT a.idA, b.idB, c.idC, d.idD
    FROM A
    LEFT OUTER JOIN B ON A.idA = B.idA
    LEFT OUTER JOIN C ON A.idA = C.idA
    LEFT OUTER JOIN D ON A.idA = D.idA
    WHERE A.idA = 1

    Quel est le résultat de cette requête ?

    Tatayo.

  14. #14
    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,

    Dans le cas où la table A contient un tuple avec comme id_tabA=1,et la table B contient aussi un tuple avec id_tabB=4 et id_tabA = 1 comme clé étrangère,et que les autres tables sont vide.

    => Ce qui veut dire que la requete suivante doit fonctionner sinon votre explication ne tiens pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select a.id, b.id, c.id, d.id
    from table_a a
    left outer join table_b b on a.id = b.id
    left outer join table_c c on a.id = c.id
    left outer join table_d d on a.id = d.id
    where a.id = 1

    Le résultat sera présenté sous forme de ligne.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    bonjour Tatoya,

    Voila ce que j'obtiens:
    idA=vide
    idB=vide
    idC=vide
    idD=vide

    au lieu de :

    idA=1
    idB=4
    idC=vide
    idD=vide

  16. #16
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Peut-tu nous mettre un jeu complet de données ?
    Car ici il n'y a aucune raison pour que cette requête ne marche pas.
    ~ Lola ~

  17. #17
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Inutile de proposer cela :
    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
    SELECT  a.id_taba
        ,   b.id_tabb
        ,   c.id_tabc
        ,   d.id_tabd
    FROM    tab_a   a
        LEFT JOIN
            tab_b   b   
            ON  b.id_taba   = a.id_taba
        LEFT JOIN
            tab_c    c
            ON  c.id_taba   = a.id_taba
        LEFT JOIN
            tab_d    d
            ON  d.id_taba   = a.id_taba
    WHERE   a.id_taba   = valeur
    Les autres l'ont déjà fait...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    @Punkoff
    Merci pinkoff ta requête marche parfaitement.

    @Lola
    Dans ta requête il fallait mettre where A.idA=1 au lieu de idA=1.
    Merci pour ton aide

    @al1_24
    Merci

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    J'ai comme un petit doute qui ne traverse l'esprit:
    Tu nous dis que le résultat est vide, ce qui est difficile à expliquer vu les infos que tu nous donnes.
    Mais est-ce que tu peux vérifier que la requête s'execute bien ? Après tout, si le moteur (non précisé d'ailleurs) rejete la requête, ceci explique celà.

    Tatayo.

    Edit: trop tard, il faut que je tape plus vite...

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

Discussions similaires

  1. Vue multi-tables sans jointure
    Par Dostix2 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/01/2013, 13h29
  2. select sur plusieurs table sans jointure
    Par oska06 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/09/2008, 11h04
  3. DELETE multi-tables avec jointures
    Par Xunil dans le forum Requêtes
    Réponses: 13
    Dernier message: 23/10/2006, 16h44
  4. Regrouper les infos de deux table sans jointure
    Par ricobye dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/07/2005, 09h30
  5. [sql] afficher deux champs de deux tables sans jointure
    Par Hell dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/06/2005, 12h38

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