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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    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
    22 042
    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 : 22 042
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 818
    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 ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 454
    Par défaut
    Je dirai que c'est faux, car ni ct ni ct2 ne remplissent toutes les conditions.

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    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
    22 042
    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 : 22 042
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/06/2013, 17h30
  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, 15h22
  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, 08h26
  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, 17h55

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