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 :

Retrouver le n-ième enregistrement qui respecte un critère


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut Retrouver le n-ième enregistrement qui respecte un critère
    Bonjour,
    Désolé pour l'intitulé du fil qui n'est pas très clair...

    En fait voilà:
    J'ai une table T_PERSONNE
    --------------------------------------------------
    ID_PERSONNE NUMBER PRIMARY KEY,
    NUM_RESSOURCE_PREFEREE NUMBER

    et une table T_RESSOURCE
    -------------------------------------
    ID_RESSOURCE NUMBER PRIMARY KEY,
    PROPRIO NUMBER
    PROPRIO est bien sûr l'ID de la personne qui possède la ressource.

    NUM_RESSOURCE_PREFEREE n'est pas un ID de ressource, mais un numéro d'ordre.

    Je voudrait modifier le schéma de base pour qu'une personne puisse avoir plusieurs ressources préférées de la manière suivante:

    T_PERSONNE
    --------------------------------------------------
    ID_PERSONNE NUMBER PRIMARY KEY

    T_RESSOURCE
    -------------------------------------
    ID_RESSOURCE NUMBER PRIMARY KEY,
    PROPRIO NUMBER
    PREFEREE NUMBER
    Maintenant, PREFEREE est un champ booléen.

    Je n'arrive pas à écrire le script de migration des données existantes.
    (Je ne veux pas casser la base et la refaire, je veux juste faire des ALTER TABLE et des UPDATE)

    J'imagine qu'il faut faire des jointures avec du ROWNUM dedans, mais je suis un peu paumé...

    Quelqu'un a une idée?

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Quelle est la relation entre NUM_RESSOURCE_PREFEREE et ID_RESSOURCE ?
    Faudrait que tu donnes des exemples de ce qu'il y a et le résultat attendu.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Alors par exemple, au début on a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T_PERSONNE:
    ID_PERSONNE NUM_RESSOURCE_PREFEREE
    -----------------------------------------
    1000        2
    1001        3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    T_RESSOURCE:
    ID_RESSOURCE PROPRIO
    -----------------------
    2000         1000
    2001         1000
    2002         1001
    2003         1001
    2004         1001
    Ce qui signifie que la ressource préférée de la personne 1000 est sa 2ème ressource (2001) et que la ressource préférée de la personne 1001 est sa 3ème ressource (2004).

    En sortie je voudrais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T_PERSONNE:
    ID_PERSONNE
    -------------
    1000
    1001
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    T_RESSOURCE:
    ID_RESSOURCE PROPRIO PREFEREE
    ---------------------------------
    2000         1000    0
    2001         1000    1
    2002         1001    0
    2003         1001    0
    2004         1001    1
    Merci d'avance à ceux qui auront des idées!

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Votre modélisation actuelle ne signifie rien telle que vous l'énoncez.
    Savez-vous que les deux tables suivantes sont rigoureusement identiques ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    T_RESSOURCE_1
    2000         1000
    2001         1000
    2002         1001
    2003         1001
    2004         1001
     
     
    T_RESSOURCE_2
    2001         1000
    2000         1000
    2003         1001
    2004         1001
    2002         1001
    Dès lors votre problème à autant de solutions que de rangements possibles.

    Admettons néanmoins que c'est le numéro d'ordre s'adjoint à la ressource triée de façon croissante.
    Je le suspecte, mais vous ne l'avez jamais précisé alors que c'est essentiel !
    Vous pouvez utiliser la fonction ROW_NUMBER.

    Les deux premières CTE sont là pour simuler vos données :
    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
    with t_personne as
    (
    select 1000 as id_personne, 2 as num_ressource_preferee from dual union all
    select 1001               , 3                           from dual
    )
      ,  t_ressource as
    (
    select 2000 as id_ressource, 1000 as proprio from dual union all
    select 2001                , 1000            from dual union all
    select 2002                , 1001            from dual union all
    select 2003                , 1001            from dual union all
    select 2004                , 1001            from dual
    )
      ,  n_ressource as
    (
    select id_ressource, proprio,
           row_number() over(partition by proprio order by id_ressource asc) as rn
      from t_ressource
    )
    select r.id_ressource, r.proprio,
           case r.rn when p.num_ressource_preferee then 1 else 0 end as preferee
      from n_ressource r
           inner join t_personne p
             on p.id_personne = r.proprio;
     
    ID_RESSOURCE	PROPRIO	PREFEREE
    2000		1000	0
    2001		1000	1
    2002		1001	0
    2003		1001	0
    2004		1001	1

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Merci pour votre réponse, c'est exactement ce que je voulais faire

    Au fait, vous avez raison: j'aurais dû préciser que le "numéro" est en fait l'ordre de création des enregistrements. Comme les ID sont générés par une séquence, c'est bien en triant par ID croissant qu'on obtient le bon numéro d'ordre.

    Bref, merci !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/11/2008, 20h32
  2. Réponses: 9
    Dernier message: 16/10/2006, 13h47
  3. Sélectionner le ième enregistrement
    Par Filippo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/07/2006, 12h04
  4. [MySQL] Sélectionner le n ième enregistrement d'une table
    Par zetta dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/07/2006, 13h00
  5. Réponses: 7
    Dernier message: 02/03/2006, 12h04

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