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 :

Ré-écrire une requete sql pour qu'elle fonctionne sous oracle


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 32
    Points : 29
    Points
    29
    Par défaut Ré-écrire une requete sql pour qu'elle fonctionne sous oracle
    Bonjour,
    J'ai une requete ecrite en sql pour la base de donnée Mysql , je veux la changer pour fonctionner sous Oracle mais je ne sais pas comment faire ça!

    C'est la requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select TRUNCATE(sum(CASE WHEN changeitem.newstring='Closed' and changeitem.groupid=changegroup.id and changegroup.issueid=jiraissue.id THEN 1 ELSE 0 END)/ 
    (select count(jiraissue.id)  
    from jiraissue join project on( jiraissue.project=project.id) 
    join priority on(jiraissue.priority=priority.id ) and project.pname IN ('project1')),2) as avgBackAndForth,  priority.pname as champ1,project.pname as champ2
    from changeitem
    join changegroup on (changeitem.groupid=changegroup.id)
    join jiraissue on (jiraissue.id=changegroup.issueid)
    join project on( jiraissue.project=project.id) 
    join priority on(jiraissue.priority=priority.id )
    and project.pname  IN ('project1')
    and  jiraissue.CREATED between '2011-05-18 00:00:00.0' and '2011-06-04 00:00:00.0' 
    group by champ1,champ2 ;

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il n'y a pas grand chose à changer à priori :
    truncate -> trunc
    les dates -> to_date
    pas d'alias dans le group by
    et une remarque, la syntaxe ANSI pour les jointures n'implique pas de ne pas utiliser la clause where...

    Et puis une requête ça s'indente un peu pour pouvoir la relire plus facilement :
    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
    SELECT TRUNC(sum(CASE WHEN changeitem.newstring = 'Closed' 
                           AND changeitem.groupid   = changegroup.id 
                           AND changegroup.issueid  = jiraissue.id 
                          THEN 1 ELSE 0 
                      END )
                 / (SELECT count(jiraissue.id)
                      FROM jiraissue 
                      JOIN project  ON jiraissue.project  = project.id
                      JOIN priority ON jiraissue.priority = priority.id 
                     where project.pname IN ('project1')
                    ),2)    AS avgBackAndForth
           , priority.pname AS champ1
           , project.pname  AS champ2
      FROM changeitem
      JOIN changegroup ON changeitem.groupid = changegroup.id
      JOIN jiraissue   ON jiraissue.id       = changegroup.issueid
      JOIN project     ON jiraissue.project  = project.id
      JOIN priority    ON jiraissue.priority = priority.id
     where project.pname  IN ('project1')
       AND jiraissue.CREATED BETWEEN to_date('2011-05-18 00:00:00','YYYY-MM-DD HH24:MI:SS') 
                                 AND to_date('2011-06-04 00:00:00','YYYY-MM-DD HH24:MI:SS')
     GROUP BY priority.pname, project.pname

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    la CASE est remplacé par des DECODE
    les AS pour les alias sont facultatifs

    AND '2011-06-04 00:00:00.0'
    le .0 de type chrono n'existe pas en Oracle


    voici la syntaxe

    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
    SELECT TRUNC(
                    sum(
                        decode(
                               changeitem.newstring,'Closed',decode(
                                                                    changeitem.groupid,changegroup.id,decode(
                                                                                                            changegroup.issueid,jiraissue.id,1,0
                                                                                                            ),0
                                                                   ),0
                               )
     
                        )/(SELECT count(jiraissue.id)  
                           FROM jiraissue JOIN project ON( jiraissue.project=project.id)JOIN priority ON(jiraissue.priority=priority.id ) AND project.pname IN ('project1')),2
                    ) AS avgBackAndForth,  
       priority.pname AS champ1,
        project.pname AS champ2
     
    FROM changeitem
    JOIN changegroup ON (changeitem.groupid=changegroup.id)
    JOIN jiraissue ON (jiraissue.id=changegroup.issueid)
    JOIN project ON( jiraissue.project=project.id) 
    JOIN priority ON(jiraissue.priority=priority.id )
    AND project.pname  IN ('project1')
    AND  jiraissue.CREATED BETWEEN to_date('2011-05-18 00:00:00','yyyy-mm-dd HH24:MI:SS') AND to_date('2011-06-04 00:00:00','yyyy-mm-dd HH24:MI:SS') 
    GROUP BY priority.pname,project.pname ;
    Bon test
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    CASE existe sur oracle et est à la fois plus puissant et lisible que DECODE notamment dans cette requête.

    [edit] Il y a une autre différence avec mysql c'est la division par 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> select 1/0 from dual;
    select 1/0 from dual
            *
    ERROR at line 1:
    ORA-01476: divisor is equal to zero
    alors que sur mysql ça dépend du mode utilisé : sqlmode_error_for_division_by_zero
    Mais bon je suppose que tu ne t'attends pas à ce que le count renvoie 0.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/01/2014, 00h51
  2. Problème pour créer une requete SQL pour DB2
    Par cnidaire dans le forum DB2
    Réponses: 3
    Dernier message: 29/06/2013, 16h57
  3. Réponses: 2
    Dernier message: 15/02/2010, 01h07
  4. Probleme ADO adapter une requete sql pour l'utiliser dans mon code vb6
    Par jacko842 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 22/04/2009, 15h53

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