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

SQL Oracle Discussion :

[Oracle10g] Combiner des appels de séquence avec un ORDER BY


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 45
    Points : 37
    Points
    37
    Par défaut [Oracle10g] Combiner des appels de séquence avec un ORDER BY
    Bonjour,

    Je souhaite insérer des données dans une table à partir d'un SELECT. Cependant, je veux insérer uniquement les n premières valeurs en fonction d'un critère (d'où une imbrication de requêtes pour combiner le ORDER BY puis le ROWNUM < n)
    Jusque là le problème est classique, mais... pour pouvoir insérer ces données dans ma table, il faut que je fasse appel à une séquence pour chaque ligne remontée. Malheureusement les appels de séquences ne semblent pas pouvoir être utilisés dans des sous-requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT *
    FROM (
       SELECT col1, col2, col3, masequence.nextval
       FROM matable
       ORDER BY col1
    )
    WHERE ROWNUM < n
    Cette requête est incorrecte, car l'utilisation d'une séquence n'est pas autorisée ici.
    J'ai essayé d'imbriquer le SELECT avec la séquence dans une autre sous-requête, sans le ORDER, mais le problème est le même.

    Existe t-il une solution pour utiliser à la fois le ROWNUM, ORDER BY et une séquence, sans passer par un parcours itératif ?

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Salut,
    Tu peux utiliser la fonction ROW_NUMBER() OVER( ORDER BY ...)
    Mais tu devrais pouvoir t'en sortir avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO ...
    SELECT masequence.NEXTVAL , a.*
    FROM (
       SELECT col1, col2, col3
       FROM matable
       ORDER BY col1) a
    non ?

    ---
    Farid

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 45
    Points : 37
    Points
    37
    Par défaut
    Merci, effectivement ça marche comme ça.

    J'ai essayé avec le ROW_NUMBER() OVER( ORDER BY ...) mais les séquences ne fonctionnent pas dans une requête imbriquée, car de toutes façons cette requête sera imbriquée dans une autre, pour pouvoir ne garder que les n lignes qui m'intéressent.

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

Discussions similaires

  1. Faire des appels avec Outlook 2007
    Par solaar dans le forum Outlook
    Réponses: 4
    Dernier message: 30/07/2008, 21h36
  2. Réponses: 1
    Dernier message: 05/06/2007, 17h14
  3. Action appelée 2 fois, avec des param différents
    Par DesiS dans le forum Struts 1
    Réponses: 2
    Dernier message: 23/08/2006, 10h47
  4. Réponses: 3
    Dernier message: 09/08/2006, 11h58
  5. [ADO/Access] Appel d’une requête avec des paramètres
    Par Taxenna dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/12/2004, 14h58

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