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

Requêtes PostgreSQL Discussion :

Requete Oracle vers PostgreSQL


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 53
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    J'ai une requête Oracle de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select DER.GC_ID, GC1.GC_NAME DESC1, GC_ID_DER, GC2.GC_NAME DESC2 
    from DER_DEROGATION DER, GENERIC_COMPONENT_GC GC1, GENERIC_COMPONENT_GC GC2
    where  GC1.GC_ID (+) = DECODE(LENGth(DER.GC_ID), 15, substr(DER.GC_ID,1,9) || substr(DER.GC_ID,14,15),
    DECODE(substr(DER.GC_ID,1,1), 'A', substr(DER.GC_ID,1,11), substr(DER.GC_ID,1,8)))
    AND GC2.GC_ID (+) = DECODE(LENGth(DER.GC_ID_DER), 15, substr(DER.GC_ID_DER,1,9) || substr(DER.GC_ID_DER,14,15),
    DECODE(substr(DER.GC_ID_DER,1,1), 'A', substr(DER.GC_ID_DER,1,11), substr(DER.GC_ID_DER,1,8)))
    AND DER.OF_ID = %s
    AND DER.OF_INDICE = %s  ;
    Il faut que je la passe en PostgreSQL.

    Je sais qu'il faut changer les DECODE en CASE WHEN et les (+) en LEFT OUTER JOIN ... ON
    Mais je ne sais pas faire les 2 changements en même temps.
    Par exemple le 1er (+) n'appelle pas de table apres.

    ca me donne ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select DER.GC_ID, GC1.GC_NAME DESC1, GC_ID_DER, GC2.GC_NAME DESC2 
    from DER_DEROGATION DER, GENERIC_COMPONENT_GC GC1, GENERIC_COMPONENT_GC GC2
    where  GC1.GC_ID LEFT OUTER JOIN ON CASE WHEN LENGth(DER.GC_ID)=15 THEN substr(DER.GC_ID,1,9) || substr(DER.GC_ID,14,15)
    WHEN substr(DER.GC_ID,1,1)='A' THEN substr(DER.GC_ID,1,11)
     ELSE substr(DER.GC_ID,1,8)
    END
    AND GC2.GC_ID LEFT OUTER JOIN ON CASE WHEN LENGth(DER.GC_ID_DER)=15 THEN substr(DER.GC_ID_DER,1,9) || substr(DER.GC_ID_DER,14,15)
     WHEN substr(DER.GC_ID_DER,1,1)='A' THEN substr(DER.GC_ID_DER,1,11)
    ELSE substr(DER.GC_ID_DER,1,8)
    END
    AND DER.OF_ID = %s
    AND DER.OF_INDICE = %s  ;
    Ca vous parait bon ?
    Pouvez-vous m'aider ?

    Merci d'avance,
    Bonne journée
    Meloo

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Non, ça va coincer, pour la simple et bonne raison que quand on passe à l'écriture normalisée des jointures (l'écriture avec INNER JOIN, LEFT JOIN...), la condition de jointure ne se met pas dans la clause WHERE, mais immédiatement après la jointure.
    Il faut donc remonter tes jointures (et les égalités associées) dès la clause FROM.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 53
    Points : 31
    Points
    31
    Par défaut
    Bonjour Ced,
    Merci bien pour ta réponse !


    J'ai essayé 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
    select DER1.GC_ID, GC1.GC_NAME DESC1, DER2.GC_ID_DER, GC2.GC_NAME DESC2 
    from GENERIC_COMPONENT_GC AS GC1 LEFT OUTER JOIN (SELECT GC_ID_DER,GC_ID, CASE WHEN LENGth(GC_ID)=15 THEN substr(GC_ID,1,9) || substr(GC_ID,14,15)
    WHEN substr(GC_ID,1,1)='A' THEN substr(GC_ID,1,11)
    ELSE substr(GC_ID,1,8)
    END 
    FROM DER_DEROGATION) AS DER1 ON DER1.GC_ID = GC1.GC_ID,
     GENERIC_COMPONENT_GC AS GC2 LEFT OUTER JOIN (SELECT GC_ID_DER,GC_ID, CASE WHEN LENGth(GC_ID_DER)=15 THEN substr(GC_ID_DER,1,9) || substr(GC_ID_DER,14,15)
    WHEN substr(GC_ID_DER,1,1)='A' THEN substr(GC_ID_DER,1,11)
    ELSE substr(GC_ID_DER,1,8)
    END
    FROM DER_DEROGATION) AS DER2
    ON DER2.GC_ID_DER = GC2.GC_ID
    WHERE DER2.GC_ID_DER=DER1.GC_ID_DER
    AND DER1.GC_ID = DER2.GC_ID
    Avec ou sans les 2 dernières lignes.

    Sans la clause WHERE j'obtiens 11.025 lignes
    Avec : 0

    La requête Oracle en revoit (si l'on omet les 2 derniers critères de recherches [les %s])

    Une idée ?

    Bonne journée
    Meloo

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Tu ne te serais pas trompé de sens dans la jointure externe?
    Avec oracle, quand on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM A,B WHERE A.id(+)=B.id
    c'est la table A qui va être complétée par des NULL
    L'équivalent avec la syntaxe SQL standard (valable aussi en Oracle d'ailleurs) est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM B left join A ON A.id=B.id
    ou ce qui revient au même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM A right join B ON A.id=B.id
    La requête Oracle en revoit (si l'on omet les 2 derniers critères de recherches [les %s])
    Note qu'en principe tu peux mettre au point ta nouvelle requête sous Oracle, ce qui te permettra plus facilement de comparer les résultats de l'ancienne version avec la nouvelle.

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2004
    Messages : 53
    Points : 31
    Points
    31
    Par défaut
    Estofilo,
    En fait tout fonctionne bien mieux quand tout est exact hein ?

    Après avoir changé la jointure externe, j'ai rajouté 1 jointure interne entre DER1 et DER2 (car elles sont sensée être les mêmes)...

    Et là ?? Miracle : 14 lignes : pareil que dans oracle...
    Que du bonheur

    Merci bien pour votre aide à tous les 2 !!

    Bonne journée,
    Meloo

    PS : la réponse, dans (l'infime) cas où une personne ai le même genre de requête un jour :
    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
    select DER1.GC_ID, GC1.GC_NAME DESC1, DER2.GC_ID_DER, GC2.GC_NAME DESC2
    from GENERIC_COMPONENT_GC AS GC1 RIGHT OUTER JOIN 
    	(SELECT OF_ID,OF_INDICE,GC_ID_DER,GC_ID, CASE 
    		WHEN LENGth(GC_ID)=15 THEN substr(GC_ID,1,9) || substr(GC_ID,14,15) 
    		WHEN substr(GC_ID,1,1)='A'	THEN substr(GC_ID,1,11) 
    		ELSE substr(GC_ID,1,8)
    			END
    	FROM DER_DEROGATION) AS DER1 
    ON DER1.GC_ID = GC1.GC_ID,
    GENERIC_COMPONENT_GC AS GC2 RIGHT OUTER JOIN 
    	(SELECT OF_ID,OF_INDICE,GC_ID_DER,GC_ID, CASE
    		WHEN LENGth(GC_ID_DER)=15 THEN substr(GC_ID_DER,1,9) || substr(GC_ID_DER,14,15) 
    		WHEN substr(GC_ID_DER,1,1)='A' THEN substr(GC_ID_DER,1,11) 
    		ELSE substr(GC_ID_DER,1,8) 
    		END 
    	FROM DER_DEROGATION) AS DER2 
    ON DER2.GC_ID_DER = GC2.GC_ID 
    WHERE DER2.GC_ID_DER=DER1.GC_ID_DER
    AND DER1.GC_ID = DER2.GC_ID 
    AND DER1.OF_INDICE = DER2.OF_INDICE 
    AND DER1.OF_ID = DER2.OF_ID 
    AND DER1.OF_ID = %s 
    AND DER1.OF_INDICE = %s  ;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/06/2014, 17h16
  2. Migration procédures stockées : Oracle vers Postgresql
    Par vingohan dans le forum PostgreSQL
    Réponses: 11
    Dernier message: 04/06/2014, 22h18
  3. Migration automatique Oracle vers postgreSQL
    Par tchasp dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 28/09/2010, 17h41
  4. Oracle vers PostGresql - outil ?
    Par lenoil dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/10/2007, 15h31
  5. Problème de traduction de SQL Oracle vers PostgreSQL
    Par Montaigne dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/04/2006, 11h15

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