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 :

LEFT JOIN sous Oracle 8i


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut LEFT JOIN sous Oracle 8i
    Bonjour, je voudrais traduire la requete suivante (MySQL et/ou Oracle9 ou + ) avec une syntaxe compréhensible par Oracle8i :

    SELECT S.STOCKID, A.ARTICLEID, A.ANAME, A.AREF FROM ARTICLE A LEFT JOIN STOCK S ON A.ARTICLEID = S.ARTICLEID AND S.WHID=1 AND S.COMPANYID=0 WHERE S.WHID IS NULL

    Surement en utilisant des (+)= mais le fait d'avoir des conditions de jointures me bloque un peu

    Une idée ?
    De préférences sans réquêtes imbiruquées, mais si ya pas d'autres solutions....

  2. #2
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    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
    SELECT 
            S.STOCKID
            , A.ARTICLEID
            , A.ANAME
            , A.AREF 
    FROM 
            ARTICLE A  
            , STOCK S 
    WHERE   A.ARTICLEID (+) = S.ARTICLEID  
    AND     S.WHID=1 
    AND     S.COMPANYID=0 
    AND     S.WHID IS NULL
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    J'ai déjà essayé ca mais là, dans ta requete les conditions :
    AND S.WHID=1
    AND S.COMPANYID=0

    sont appliqué aux résultats et non à la table de jointure...
    Du coup, j'ai un S.WHID=1 ... AND S.WHID IS NULL qui ne marchera jamais...

    En gros il me faudrait un truc qui ressemble à :

    SELECT S.STOCKID, A.ARTICLEID, A.ANAME, A.AREF FROM ARTICLE A,STOCK S
    WHERE (A.ARTICLEID (+)= S.ARTICLEID AND S.WHID=1 AND S.COMPANYID=0)
    AND S.WHID IS NULL

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    en fait, une requête imbriquée marcherait super :

    SELECT A.ARTICLEID
    FROM ARTICLE A
    WHERE A.ARTICLEID NOT IN (SELECT S.ARTICLEID FROM STOCK S WHERE S.WHID=1 AND S.COMPANYID=0);

    mais le soucis c'est que ma table ARTICLE contient 100.000 enregistrements, presque autant pour STOCK, et si je fait une requete imbriquée..il me charge 2x 100.000 enregistrements en mémoire avant de faire le NOT IN.. ca prend un temps fou, alors que c'est très rapide avec un bon LEFT JOIN....

  5. #5
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    et comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A.ARTICLEID 
    FROM ARTICLE A 
    WHERE NOT Exists (  SELECT Null 
                        FROM STOCK S 
                        WHERE S.WHID=1 AND S.COMPANYID=0
                        And A.ArticleID = S.ArticleID
                     );
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A.ARTICLEID 
    FROM ARTICLE A 
    WHERE NOT Exists (  SELECT Null 
                        FROM STOCK S 
                        WHERE S.WHID=1 AND S.COMPANYID=0
                        And A.ArticleID = S.ArticleID
                     );
    Ca à l'air de marcher...peut-tu m'expliquer ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Et si je veux rajouter une condition, genre
    AND A.ANAME LIKE %tralala%

    Je la mets où ?

  8. #8
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    si tu veux restreindre les Rows de A (comme ici) alors dans la requête principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.ARTICLEID 
    FROM ARTICLE A 
    WHERE NOT Exists (  SELECT Null 
                        FROM STOCK S 
                        WHERE S.WHID=1 AND S.COMPANYID=0 
                        And A.ArticleID = S.ArticleID 
                     )
    AND A.ANAME LIKE '%tralala%' ;
    PS attention, le LIKE attend des caractère entre simples quotes !! (je les ai ajoutées)
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  9. #9
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    pour l'explication :

    En gros, dans ce cas-ci, Oracle va extraire UNE SEULE FOIS 2 Sets de données (la requête pricipale et la sous requête) et les comparer.

    Alors qu'avaec le NOT IN, Oracle va effectuer la sous-requête pour chaque ligne ramenée par le requête principale...

    ATTENTION : cette explication est vraiment "à la louche" ! Le Tuning des requêtes Oracle est bien plus fin que ça, et il existe des cas où le NOT IN sera plus performant que le NOT EXISTS !
    Il ne faut pas prendre cette explication cpmme une règle définitive, mais comme un "Best Practice" qui est à envisager en cas de mauvaises perf avec le Not IN...

    je ne peux que t'encourager à allez voir les Doc existant déjà sur le Tuning des requêtes Oracle.
    ICI http://oracle.developpez.com/cours/ section TUNING
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par Yorglaa
    si tu veux restreindre les Rows de A (comme ici) alors dans la requête principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.ARTICLEID 
    FROM ARTICLE A 
    WHERE NOT Exists (  SELECT Null 
                        FROM STOCK S 
                        WHERE S.WHID=1 AND S.COMPANYID=0 
                        And A.ArticleID = S.ArticleID 
                     )
    AND A.ANAME LIKE '%tralala%' ;
    PS attention, le LIKE attend des caractère entre simples quotes !! (je les ai ajoutées)
    J'ai l'impression que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.ARTICLEID 
    FROM ARTICLE A 
    WHERE NOT Exists (  SELECT Null 
                        FROM STOCK S 
                        WHERE S.WHID=1 AND S.COMPANYID=0 
                        And A.ArticleID = S.ArticleID 
                     )
    AND A.ANAME LIKE '%tralala%' ;
    sous ORACLE 8i ne correspond pas aux résultats de la requête suivante exécuter sous MyQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.ARTICLEID FROM ARTICLE A LEFT JOIN STOCK S ON A.ARTICLEID = S.ARTICLEID AND S.WHID=1 AND S.COMPANYID=0 WHERE S.WHID IS NULL AND  A.ANAME LIKE '%tralala%'

    La requete LEFT JOIN me renvoi bien un résultat...sous MySQL. Sous ORACLE 9, la requete LEFT JOIN ne me renvoie rien, et sous ORACLE 8i, la requete NOT EXISTS ne renvoie rien non plus...

    Un début d'explication ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    On annule mon histoire de LIKE '%trlal%' , c mon code qui bugge sur ca..donc la requete NOT EXISTS fonctionne parfaitement

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Je vais ouvrir un autre Thread sur la gestion des conditions de Jointure sur ORACLE8i

Discussions similaires

  1. LEFT JOIN + Sous-requête retourne "NULL"
    Par wenijah dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/03/2012, 17h02
  2. Requete avec Left Join sous MySQL 4 et 5
    Par gpers dans le forum Requêtes
    Réponses: 3
    Dernier message: 11/05/2009, 18h04
  3. Réponses: 3
    Dernier message: 06/06/2007, 18h45
  4. Pas de JOIN sous Oracle (vraiment dommage...)
    Par Isildur dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/03/2007, 11h28
  5. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38

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