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 :

Conversion d'une requête avec JOIN


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Conversion d'une requête avec JOIN
    Bonjour, comme mon pseudo le souligne, je suis débutant en SQL et je bute sur un problème que les différents (et excellents) tutoriels disponibles sur Developpez.com ne m'ont pas permis de résoudre. Je dois mal poser mon problème ...
    Voilà, je souhaite convertir une requête de cette forme, où les jointures sont faites avec "WHERE" en son équivalent avec l'instruction "JOIN" :


    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
     
    SELECT DISTINCT
    SUBSTR(ls.lot_id,1,16) AS lot, 
    SUBSTR(ct.slot_id,1,2) AS slot, 
    etc.. 
    SUBSTR(rn.equipment_id,1,5) AS equip
     
    FROM
    run rn,
    chamber_tracking ct,
    operation oper,
    lot_step ls
     
    WHERE
    ls.lot_id LIKE 'ABC%'
    AND ls.lot_id= ct.lot_id 
    AND ls.run_id = rn.run_id
    AND ls.operation_name=oper.operation_name
    AND ct.run_id = rn.run_id

    Les tables ct, ls et rn sont jointes chacune à l'autre, et je n'arrive pas
    à traduire ceci correctement.

    Merci pour votre aide éventuelle.

  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 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Voici :

    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 DISTINCT SUBSTR(ls.lot_id,1,16) AS lot,
           SUBSTR(ct.slot_id,1,2) AS slot,
           -- etc..
           SUBSTR(rn.equipment_id,1,5) AS equip
     
    -- une jointure est un arbre. Il y a une table "racine" :
    FROM   run rn
    -- une première branche relative à la racine :       
           INNER JOIN chamber_tracking ct ON rn.run_id = ct.run_id 
    -- une seconde branche mal foutue est grefée à la fois sur la racine et sur la première branche :
           INNER JOIN lot_step ls         ON rn.run_id = ls.run_id AND ls.lot_id= ct.lot_id
    -- une troisième branche gréfée sur la seconde :       
                  INNER JOIN operation oper      ON ls.operation_name=oper.operation_name
     
    WHERE ls.lot_id LIKE 'ABC%'
    Chaque clause ON introduit un prédicat de jointure qui indique sur quelle critère elle se fait.
    Relisez les cours que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

    Cependant la présence de cette branche mal foutue est généralement synonyme d'erreur de modélisation, ou de codage de requête...
    On appelle cela jointure cyclique et dans votre cas particulier triangulaire...

    A +

  3. #3
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    De la même manière qu'il y a
    Citation Envoyé par SQLPro
    une troisième branche gréfée sur la seconde
    , ne peut-on couper la deuxième branche mal foutue en deux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FROM  run rn
    -- une première branche relative à la racine :       
           INNER JOIN chamber_tracking ct ON rn.run_id = ct.run_id 
    -- une seconde branchecoupée en 2 :
           INNER JOIN lot_step ls         ON rn.run_id = ls.run_id 
                  INNER JOIN chamber_tracking ct2 ON ls.lot_id= ct2.lot_id
    -- une troisième branche greffée sur la seconde :       
                  INNER JOIN operation oper      ON ls.operation_name=oper.operation_name
    Je vois bien que ça met en jeu deux fois la même table.
    Est-ce tout simplement faux ?
    Est-ce équivalent à la branche mal foutue ?
    Est-ce mieux ?

  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 394
    Points
    18 394
    Par défaut
    Je dirai que c'est faux, car ni ct ni ct2 ne remplissent toutes les conditions.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Merci !
    Merci pour votre aide,

    En réfléchissant aujourd'hui j'ai écrit ceci :


    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 DISTINCT SUBSTR(ls.lot_id,1,16) AS lot,
           SUBSTR(ct.slot_id,1,2) AS slot,
           -- etc..
           SUBSTR(rn.equipment_id,1,5) AS equip
     
    FROM   lot_step ls
           INNER JOIN chamber_tracking ct
                 ON ls.lot_id = ct.lot_id
                  AND ls.run_id = ct.run_id     (c1)
           INNER JOIN run rn
                  ON  ls.run_id = rn.run_id       (c2)
           INNER JOIN operation oper
                  ON ls.operation_name=oper.operation_name
     
    WHERE ls.lot_id LIKE 'ABC%'
    Il me semble que ça donne les mêmes résultats, mais est-ce correct ?
    En effet, je pense que (c1) & (c2) est équivalent à "ct.run_id = ls.run_id"

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    J'espère que vous comprenez maintenant pourquoi écrire des jointures avec JOIN est plus précis et efficace qu'en mettant tout dans un WHERE fourre tout ou vous ne voyez rien, et surtout pas vos erreurs !

    Je m'étonne d'ailleurs toujours que l'on continue à enseigner la jointure dans le WHERE alors que cette syntaxe est obsolète depuis plus de 15 ans !

    A +

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Leçon apprise
    Bonsoir,

    Oh, on ne m'a rien enseigné ...

    Pour les besoins de mon travail j'ai repris des routines SQL qui avaient été écrites par d'autres avant moi sans vraiment les comprendre.

    J'ai à présent le temps et le recul pour me pencher sur SQL et sur la réécriture de ces requêtes et je découvre des horreurs.

    Ceci étant dit, une fois réécrites convenablement, les requêtes tournent PLUS LENTEMENT sur le serveur sqlplus de mon entreprise. Je n'y comprends rien.

    Juste une remarque : avant de faire cette démarche, j'ai également généré beaucoup de requêtes avec TOAD et Business Object. Le résultat de ces générateurs automatique contient uniquement les horribles jointures avec "WHERE".

    Bonnes fêtes !

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Juste une remarque : avant de faire cette démarche, j'ai également généré beaucoup de requêtes avec TOAD et Business Object. Le résultat de ces générateurs automatique contient uniquement les horribles jointures avec "WHERE".
    Ces outils doivent marcher avec des versions antérieures et par conséquent délivrent en règle générale une syntaxe SQL très bas de gemme !

    Ceci étant dit, une fois réécrites convenablement, les requêtes tournent PLUS LENTEMENT sur le serveur sqlplus de mon entreprise. Je n'y comprends rien.
    SQLplus n'est pas un SGBDR. C'est un outil client...
    Avez vous fait un portage de votre base ?

    A +

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    SQLplus n'est pas un SGBDR. C'est un outil client...
    Avez vous fait un portage de votre base ?
    Pardon pour cette imprécision ... étant autodidacte en informatique, je manque de rigueur.

    La base elle même est de type Oracle version 9.
    Qu'entendez-vous par portage ?

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Migré une base d'un serveur à l'autre ou d'une version à l'autre ?

    A +

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Non, ce genre de manipulations est réservé à l'équipe IT de ma compagnie.

    Je suis simplement un employé qui code dans son coin des applications pour simplifier son travail quotidien.

    J'écris des programmes en VB qui génèrent des requêtes SQL, les soumettent à SQL*Plus, puis récupèrent le résultat et effectuent des calculs spécifiques avec.

    Je n'ai donc aucun pouvoir sur l'architecture même des bases ou leur implémentation.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/06/2013, 18h30
  2. [WD12] Erreur dans une Requête avec plusieurs INNER JOIN
    Par Raphael1980 dans le forum WinDev
    Réponses: 3
    Dernier message: 12/06/2009, 16h22
  3. [SQL] Requête dans une requête...avec des INNER JOIN!
    Par PedroBD dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 06/04/2006, 09h26
  4. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 18h55

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