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 :

Jointure ORACLE


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 57
    Points : 50
    Points
    50
    Par défaut Jointure ORACLE
    Bonjour a tous,

    J'ai tapé ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select 
    	FicheRepar.numficherep as Fiche, 
    	FicheRepar.datcrefiche as Date_Creation, 
    	FicheRepar.mission as mission, 
    	FicheRepar.refarticle as Article
    From FicheRepar JOIN FicheRepar_Clausierana ON FicheRepar.numficherep = FicheRepar_Clausierana.numficherep
    where (FicheRepar.CtrlGest is null or FicheRepar.CtrlGest = 'Non') and rownum <= 10;
    Quelle fut ma surprise en voyant que cela ne marche pas: "La commande SQL ne se termine pas correctement"

    Je tape donc ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select 
    	FicheRepar.numficherep as Fiche, 
    	FicheRepar.datcrefiche as Date_Creation, 
    	FicheRepar.mission as mission, 
    	FicheRepar.refarticle as Article
    From FicheRepar FicheRepar_Clausierana
    where (FicheRepar.CtrlGest is null or FicheRepar.CtrlGest = 'Non') and rownum <= 10 and FicheRepar.numficherep = FicheRepar_Clausierana.numficherep
    Et là, ça passe !!!!

    Donc, apres avoir lu des posts divers: oracle ne supporte t'il donc pas le JOIN??? Je viens de faire du Mysql et du sql server dans mes projets précédents, et il faut dire que si c'est la cas, ça m'étonne carrément!!! Car du coup, quid de la lisibilité et des performances ????

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    As-tu essayé avec INNER JOIN ?
    Quelle version d'ORACLE ?
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 57
    Points : 50
    Points
    50
    Par défaut
    Et bien avec le INNER c'est pareil l'erreur se fait sur le Inner et pas sur le join lol !

    C'est une Oracle8i v8.1.7

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Il faut la 9i minimum pour la syntaxe normée.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 57
    Points : 50
    Points
    50
    Par défaut
    ok, ça confirme le truc... je reste scié !!

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Attention si oracle 8i ne supporte pas la syntaxe normée, cela n'influe pas sur la performance.

    Néanmoins, il serait sans doute plus performant d'écrire la requête de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select 
       FicheRepar.numficherep as Fiche, 
       FicheRepar.datcrefiche as Date_Creation, 
       FicheRepar.mission as mission, 
       FicheRepar.refarticle as Article 
    From FicheRepar
    where exists (select 1
                  from FicheRepar_Clausierana 
                  where nvl(FicheRepar.CtrlGest, 'Non') = 'Non'
                    and FicheRepar_Clausierana.numficherep = FicheRepar.numficherep)
      and rownum <= 10;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    plaineR >>
    1/ comment peux-tu savoir que ta requête sera plus performante (grâce au plan d'exécution : peut-on avoir +d'infos sous sqlplus) ?

    2/ le fait d'utiliser "select 1" dans la sous-requête n'est pas optimal d'après SQLpro car "select *" serait plus optimisé car la "meilleure" colonne serait alors choisie. As-tu testé et constaté une différence significative ?
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    J'ai bien dit "sans doute"

    Parce qu'il ne fait pas la jointure pour chaque enregistrement des 2 tables, mais qu'il s'arrête quand il a trouvé une occurence de FicheRepar.numficherep dans FicheRepar_Clausierana.

    Après ça dépend des indexes, de la composition des tables, des données, etc.

    Pour ce qui est du * à la place du 1 sous Oracle je n'ai remarqué aucune différence perceptible de performance.

    Mais voici un exemple :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SQL> select count(*) from table1;
     COUNT(*)
    ---------
       426840
     
    SQL> select count(*) from table2;
     COUNT(*)
    ---------
        68062
     
    SQL> select *
      2  from table1 t1
      3  where exists (select 1
      4            from table2
      5            where col1= t1.col1);
    no rows selected
     real: 4860
     
    SQL> select *
      2  from table1 t1, table2
      3  where t1.col1 = t2.col1;
    no rows selected
     real: 15547
     
    SQL> select *
      2  from table1
      3  where exists (select *
      4            from table2
      5            where col1 = t2.col1);
    no rows selected
     real: 5047
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Ok et thanks pour toutes ces explications mais si je vois bien ce que tu veux me montrer du doigt que signifie sous sqlplus :Je n'ai pas cet affichage sur mon éditeur sqlplus...
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    C'est le temps ( en ms) que met la requête à s'exécuter. Pour l'obtenir il suffit de faire :
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

Discussions similaires

  1. Jointures Oracle 9/10i par ex
    Par helrick dans le forum SQL
    Réponses: 1
    Dernier message: 27/07/2010, 11h25
  2. Jointure oracle dbase
    Par sly60 dans le forum Bases de données
    Réponses: 4
    Dernier message: 16/07/2008, 11h54
  3. [XML] - Jointure ORACLE XML 10GR2
    Par jacquesh dans le forum SQL
    Réponses: 1
    Dernier message: 22/07/2007, 22h34
  4. probleme index bitmap de jointure, oracle 10g
    Par nagty dans le forum Oracle
    Réponses: 2
    Dernier message: 19/04/2006, 20h14
  5. Réponses: 6
    Dernier message: 20/09/2004, 15h26

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