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

Requêtes PostgreSQL Discussion :

Jointure avec une autre requête


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut Jointure avec une autre requête
    Bonjour à tous,

    Je débute presque totalement en SQL (j'en ai fais un peu à l'école il y a plus de 10 ans ) et classiquement je suis plus VBA, donc ma question est peut être toute bête mais je ne trouve pas la solution.

    Voila j'ai un projet dans lequel j'ai écris une requête assez balèze (enfin pour mon niveau ) qui me donne comme résultat 2 colonnes A et B avec plusieurs A qui peuvent lié à un même B.

    A B
    A1 B1
    A2 B1
    A3 B2
    A4 B1
    A5 B1
    A6 B3
    A7 B2
    A8 B1
    A9 B4

    Ensuite j'ai besoin de faire un autre requête qui me recherche des B et auxquels je voudrait lié les A que j'ai trouvé. J'ai fais une truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select *
    from base_B
    join (select A, B
    		from base_A) rA on B = rA.B
    Donc est-ce que j'ai le droit de faire ça ? Et après dans l'éxécution comment cela se comporte-t-il ? Le select du join est recalculé à chaque "ligne" trouvé par le select * ou est-ce qu'il est calculé une fois au départ et après il se fait une jointure comme cela se passerait avec une autre table ?

    Voilà j'ai essayé de faire simple et clair j'espère que ça le sera.

    Merci d'avance pour vos coups de main.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 669
    Billets dans le blog
    10
    Par défaut
    Le résultat de la requête entre parenthèses est une table (on parle de table dérivée).

    La jointure se comporte comme n'importe quelle autre jointure.
    Par contre, il faut utiliser un alias pour cette table dérivée, comme vous l'avez fait en utilisant "RA" mais aussi pour l'autre table (base_b) par exemple ainsi : on rB.B = rA.B.

    Il est sans doute possible de produire le résultat final en une seule requête, pour ça, il faut que vous communiquiez la description de toutes les tables utilisées et un extrait du contenu.

    Note : évitez les select *, n'utilisez que les colonnes utiles pour le traitement

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Bonjour,

    Merci pour la réponse.

    Donc en fait oui je ne met de select * là c'était pour l'exemple, pareil pour le rB c'est un oubli.

    Par contre je viens de comprendre ce qui me pose problème, c'est qu'en fait dans ma table dérivée le fait d'avoir plusieurs A pour un même B la requette va me sortir une ligne par B. Et vu la quantité de données que je gère ca mouline pas mal. J'ai encore du mal avec la logique SQL .

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 669
    Billets dans le blog
    10
    Par défaut
    Pouvez-vous communiquer la première requête, celle qui produit le premier "tableau", encore une fois, il est certainement possible de produire le résultat final à partir d'une seule requête

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 103
    Par défaut
    Bonjour,

    Je veux bien mais pas sur que vous y compreniez grand chose sans toutes les tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select b.id_metier_ as pb, b.pa, si.PB, si.PA_from_SIREO,z.id_metier_ as pa
    from ftth_pf b
    join (select fi.id_metier_, si.code_imb, z.id_metier_ as PB, si.id_pa as PA_from_SIREO, f1.id_regleme as PA_PB
    		from ftth_immeuble fi
    		full join sireo_immeuble si on si.code_imb = fi.id_metier_
    		full join ftth_zone_eligibilite z on st_intersects(z.geom,fi.geom)
    		inner join ftth_pf f on f.id_metier_ = z.id_metier_ 
    		inner join ftth_pf f1 on f1.id_metier_ = f.pa
    		where (si.code_plaque like '%1017' or si.code_plaque like '%1117') and (z.id_metier_ like '%PB%' or z.id_metier_ like '%Autre%')) si on pb = si.PB
    inner join ftth_zone_eligibilite z on st_intersects(z.geom,b.geom)
    where (b.id_metier_ like '%PB%' or b.id_metier_ like '%Autre%') and z.id_metier_ like '%PA%'

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 669
    Billets dans le blog
    10
    Par défaut
    Beaucoup de choses à dire sur cette requête

    2 full outer join c'est suspect, mais admettons, par contre le fait de les coder ainsi en combinaison avec des jointures inner est dangereux.
    En cas de combinaisons de jointures inner et outer, il faut utiliser la syntaxe suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [...]
    FROM T1
    (FULL/LEFT/RIGTH) OUTER JOIN T2
        INNER JOIN T3   
           ON critères de jointure T2/T3
        ON critères de joiture T2/T1
    De plus, il y a des restrictions sur des tables OUTER, de ce fait, les jointures deviennent implicitement des jointures INNER.

    Enfin, les critères de restriction ne sont pas sargables (début des arguments du like %) ==> aucun index n'est éligible

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

Discussions similaires

  1. Requête avec un Having SUM avec une autre requête
    Par robinwood01 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 16/03/2011, 14h26
  2. Réponses: 5
    Dernier message: 16/11/2010, 14h46
  3. Réponses: 4
    Dernier message: 21/10/2010, 23h34
  4. Générer requête HTTP avec une autre IP
    Par Linkman_xbp dans le forum Windows
    Réponses: 0
    Dernier message: 18/09/2010, 16h29
  5. jointure avec une table dans une autre DB
    Par bastringue dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/05/2008, 16h34

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