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

Oracle Discussion :

differnce entre jointures classiques et jointure normalisées


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Points : 6
    Points
    6
    Par défaut differnce entre jointures classiques et jointure normalisées
    bonjour
    je travaille sous Oracle 9
    jai un resultat de requete que je n'explique pas

    jai 3 table a, b et c liées par integrité referentielle

    chacune delle a une colonne appelée dtdeff

    donc losque jexecute la requete suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT dtdeff 
    FROM A,B, C
    WHERE  A.fkb = B.pkb
    AND B.fkc = c.pkc
    jai un
    Ora 00918 : definition de colonne ambigue
    ce qui est normal car je nai pas specifié la table d'ou provient le dtdeff
    jusque la je comprends ....


    par contre quand jexecute la meme requete mais avec des jointures normalisées sans specifier lorigine de ma dtdeff
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT dtdeff 
    FROM A
    inner join B ON A.fkb = B.pkb
    inner join C ON B.fkc = c.pkc
    je ne pas de message derreur et il me ramene les dtdeff de B !!!!

    alors la je ne comprends plus rien ....
    pourkoi je nai plus de message derreur ora00918 ????
    pour me remène t il les dtdeff de la table B ???
    pourquoi pas les dtdeff de la table A ?? ou C ????

    cest vrai kil suffirai que je fasse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.dtdeff 
    FROM A
    inner join B ON A.fkb = B.pkb
    inner join C ON B.fkc = c.pkc
    pour solutionner mon probleme...
    mais jaime bien comprendre les truc ;-)
    si kelkun a une idée ....

  2. #2
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    C normal tu ne selectionne le champ dtdeff que de A

    SELECT dtdeff
    FROM A
    par contre moi ce qui m'etonne (mais j'ai lu en diagonale...)
    c que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inner join C ON B.fkc = c.pkc
    ne t'insulte pas ?

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 125
    Points : 102
    Points
    102
    Par défaut
    S'il ne ramène que les dtdeff de B c'est pour optimiser la requête. En effet, la table B est utilisée dans les deux jointures AB et BC, il est donc plus simple pour Oracle de ramener les dtdeff de B issus de la première jointure avec A, puis d'effectuer la seconde jointure avec C (ou l'inverse : BC puis AB).

  5. #5
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Re,

    ça me bluffe ton truc ...
    Je ne savais pas qu'on pouvait écrire ça comme ça.
    Sympa d'avoir expliqué ... au moins je me coucherais moins ignorant ce soir ;-)

  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 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    C'est visiblement un bug d'Oracle.

    En effet en cas d'ambiguité sur le nom de la colonne, la requête devrait ne pas être exécutée et retourner une erreur de syntaxe.

    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/ * * * * *

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    pas du tout, c'est extrémement logique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT dtdeff
    FROM A
    inner join B ON A.fkb = B.pkb
    inner join C ON B.fkc = c.pkc
    Signifie : je sélectione dtdeff de la table A selon les jointures décritres via INNER JOIN. Tout cela est donc parfaitement logique

    En revance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT dtdeff
    FROM A,B
    inner join C ON B.fkc = c.pkc
    WHERE A.fkb = B.pkb
    Doit bien retourner une erreur si dtdeff est également dans B

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    orafrance qu'en tu dis :
    pas du tout, c'est extrémement logique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT dtdeff
        FROM A
        inner join B ON A.fkb = B.pkb
        inner join C ON B.fkc = c.pkc
    Signifie : je sélectione dtdeff de la table A selon les jointures décritres via INNER JOIN. Tout cela est donc parfaitement logique

    Moi cela ne me parait pas tres logique car ce n'est pas la date de A ki est retourné .......

    SELECT dtdeff, A.dtdeff, B.dtdeff, C.DTDEFF
    FROM A
    inner join B ON A.fkb = B.pkb
    inner join C ON B.fkc = c.pkc

    donne :

    DTDEFF A.DTDEFF B.DTDEFF C.DTDEFF
    01/09/2004 20/06/2005 01/01/2005 01/09/2004
    [/code]
    de plus entre hier et aujourdhui les resultats ont changé, le jeu dessai n'est plus le meme ....
    Hier il me retourné la date de B, aujourdhui avec la meme requete cest la date de C ........


    : : :

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ha oui... là effectivement c'est moins logique...

    Ce qui est logique à mon sens c'est que l'écriture normalisée permet de mieux maitriser ce qui est sélectionnée

    Je vais voir du coté du spport si je trouve quelque chose

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    tu aurais le plan d'exécution STP

    En fait, celui en écriture normalisé et l'autre

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    D'après les témoignages sur Metalink qu'Oracle sélectionne la valeur de la dernière table jointe... pourquoi pas après tout

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT dtdeff
        FROM A
        inner join C ON B.fkc = c.pkc
        inner join B ON A.fkb = B.pkb

    Est-ce bien b.dtdeff qui est sélectionnée ?

  12. #12
    Futur Membre du Club
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    merci pour tes recherches Orafrance
    pour ton premier message : le plan de la requete avec les jointures normalisées et le plan de la requete avec les jointures classique sont exactement identiques , cest a dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT STATEMENT Hint=CHOOSE	
      NESTED LOOPS		  	
      |  NESTED LOOPS	  	 	      	             	 
      |  |  INDEX FULL SCAN	INDEX de la pk de A 	  	 
      |  |  TABLE ACCESS BY INDEX ROWID	de la TABLE B	 
      |  |    INDEX UNIQUE SCAN	INDEX de la pk de B	  	 
      |  TABLE ACCESS BY INDEX ROWID  de la TABLE C	  	 
      |    INDEX UNIQUE SCAN	de la pk de C
    pour ce ki est de 2eme ton message il n'est pas possible de faire comme tu le dis :
    SELECT dtdeff
    FROM A
    inner join C ON B.fkc = c.pkc
    inner join B ON A.fkb = B.pkb

    jai un ora 00904 --> idendtificateur non valide

    en effet mon SCHEMA est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    +--------+          +--------+          +--------+
    |   A    |          |   B    |          |   C    |
    +--------+          +--------+          +--------+
    |  pkA   |  +------>|  pkB   |   +----->|  pkc   |
    |  fkB   |--+       |  fkc   |--+       |        |
    | dtdeff |          | dtdeff |          | dtdeff |
    |  ...   |          |  ...   |          |  ...   |
    +--------+          +--------+          +--------+
    je n'ai pas de lien direct entre A et C , je dois donc commencer par le inner join sur B puis le inner join sur C !!

    la verité est donc ailleurs :cry:
    mais ou ?????



    [/img]

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ceci étant... au risque de pareil un peu tatillon, on se demande pourquoi dtdeff est dans toutes les tables... Orafrance ou l'art de détourner l'attention

    Bon... je vais continuer de creuser

    Je ne pensais pas que l'ordre de jointure avait de l'importance... voila qui ajoute une contrainte non dégligeable mais une qualité de lecture non moins négligeable

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2002
    Messages : 66
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par orafrance
    Je ne pensais pas que l'ordre de jointure avait de l'importance... voila qui ajoute une contrainte non dégligeable mais une qualité de lecture non moins négligeable
    bah idem...

    je viens de tester sur des requete avec des plans d'execution assez grands... et l'inversion des tables dans la clause from ou l'inversion des jointures dans la clause WHERE ne change rien ....
    et quelque soit le type de jointure...

    Normalement l'optimiser de la base remet les clauses from et where en ordre avant l'execution ... non ?

  15. #15
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 125
    Points : 102
    Points
    102
    Par défaut
    Quand on utilise le mot clé 'JOIN' l'ordre des jointures à de l'importance.
    Quand on fait des jointures dans la clause WHERE, l'ordre n'a pas d'importance.

  16. #16
    Futur Membre du Club
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    mouais
    jai limpression kil doit s'agir dun bugg ORACLE, je n'ai pas dexplication plus logique .......


Discussions similaires

  1. Différences entre les algorithmes de jointure
    Par kochfet dans le forum Optimisations
    Réponses: 0
    Dernier message: 11/06/2013, 10h18
  2. Différences entre les types de jointures
    Par Age_of_Aquarius dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/04/2013, 03h55
  3. Réponses: 13
    Dernier message: 14/02/2013, 16h41
  4. Différence de calcul entre deux techniques de jointure
    Par berceker united dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/06/2012, 11h31
  5. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 10h29

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