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

Langage SQL Discussion :

Aide avec un select sur un range


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 90
    Par défaut Aide avec un select sur un range
    Bonjour les gens,

    Un peu d'aide siouplait.

    Au début il y avait une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table NEW_TABLE
    (
      id     VARCHAR2(50) not null,
      NR_FROM VARCHAR2(10) not null,
      NR_TO    VARCHAR2(10) not null
    )
    Cette table contient un id, et 2 numéro de téléphone qui crée un range (FROM->TO)

    Quelques exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into new_table (ID,NR_FROM,NR_TO) values ('ID1','0123456789','0123456789');
    insert into new_table (ID,NR_FROM,NR_TO) values ('ID2','0123456790','0123456799');
    insert into new_table (ID,NR_FROM,NR_TO) values ('ID3','0123456887','0123456890');
    Je voudrais écrire en un select quelque chose qui m'ouvrirait les range pour me donner un résultat de ce type-ci :
    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
    ID	NUMERO
    -----------------------------
    ID1	0123456789
    ID2	0123456790
    ID2	0123456791
    ID2	0123456792
    ID2	0123456793
    ID2	0123456794
    ID2	0123456795
    ID2	0123456796
    ID2	0123456797
    ID2	0123456798
    ID2	0123456799
    ID3	0123456887
    ID3	0123456888
    ID3	0123456889
    ID3	0123456890
    Pour info, les données sont introdutes de telle manière qu'un meme numéro ne se retrouve jamais dans 2 range différents. Autrement dit la combinaison ID-NUMERO est unique.

    Il y a evidemment la solution de la fonction "pipelined" qui me renvoie un par un les NUMERO en passant dans une boucle, mais je voudrais éviter.

    Je me demande si il existe une solution purement "select".

    Une idée ?

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Par exemple :
    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
    32
    33
    34
    35
    36
    SQL> with NEW_TABLE as (
      2  select 'ID1' as id,'0123456789' as nr_from,'0123456789' as nr_to from dual union all
      3  select 'ID2' as id,'0123456790' as nr_from,'0123456799' as nr_to from dual union all
      4  select 'ID3' as id,'0123456887' as nr_from,'0123456890' as nr_to from dual
      5  )
      6  SELECT t.id, x.column_value AS NUMERO
      7    FROM NEW_TABLE t
      8   CROSS JOIN TABLE(
      9                   cast(multiset(
     10                           SELECT '0'||to_char(to_number(nr_from) + level - 1)
     11                             FROM dual
     12                          connect BY level <= to_number(nr_to)- to_number(nr_from) + 1
     13                               ) AS sys.odcivarchar2list )
     14                            ) x;
     
    ID  NUMERO
    --- ----------
    ID1 0123456789
    ID2 0123456790
    ID2 0123456791
    ID2 0123456792
    ID2 0123456793
    ID2 0123456794
    ID2 0123456795
    ID2 0123456796
    ID2 0123456797
    ID2 0123456798
    ID2 0123456799
    ID3 0123456887
    ID3 0123456888
    ID3 0123456889
    ID3 0123456890
     
    15 rows selected.
     
    SQL>
    Ou sinon avec une CTE recursive à partir de 11GR2.

    Si les numéros de tel peuvent être en +33 alors il faudra récupérer la partie numérique à incrémenter avec une expression régulière ou un substr.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 90
    Par défaut wooowww !!
    je ne comprends absolument rien à la réponse !!!!!!!
    Mais cela fonctionne.

    Je m'en vais donc de ce pas étudier tout cela.

    Toujours content d'apprendre un nouveau truc !

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Regarde Utilisation du connect by level pour une autre approche, proposée par Waldar, plus simple à utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH NEW_TABLE AS (
    SELECT 'ID1' AS id,'0123456789' AS nr_from,'0123456789' AS nr_to FROM dual union ALL
    SELECT 'ID2' AS id,'0123456790' AS nr_from,'0123456799' AS nr_to FROM dual union ALL
    SELECT 'ID3' AS id,'0123456887' AS nr_from,'0123456890' AS nr_to FROM dual
    )
    select id, '0' || to_char(to_number(nr_from) + level - 1) as numero
      from new_table
    connect by level <= to_number(nr_to) - to_number(nr_from) + 1
       AND PRIOR id = id
       AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    En fait à la place de dbms_random il vaut mieux utiliser sys_guid :
    DBMS_RANDOM.value in hierarchical solution to string to table?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH NEW_TABLE AS (
    SELECT 'ID1' AS id,'0123456789' AS nr_from,'0123456789' AS nr_to FROM dual union ALL
    SELECT 'ID2' AS id,'0123456790' AS nr_from,'0123456799' AS nr_to FROM dual union ALL
    SELECT 'ID3' AS id,'0123456887' AS nr_from,'0123456890' AS nr_to FROM dual
    )
    select id, '0' || to_char(to_number(nr_from) + level - 1) as numero
      from new_table
    connect by level <= to_number(nr_to) - to_number(nr_from) + 1
       AND PRIOR id = id
       and prior sys_guid() is not null

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

Discussions similaires

  1. Probleme avec un select sur deux tables
    Par nakk01 dans le forum Débuter
    Réponses: 3
    Dernier message: 04/05/2011, 13h17
  2. Requête update avec un select sur la même table
    Par sheira dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/09/2010, 16h09
  3. Réponses: 2
    Dernier message: 18/08/2008, 08h57
  4. Update avec un select sur la même table
    Par Xunil dans le forum Administration
    Réponses: 5
    Dernier message: 09/04/2007, 16h40
  5. pb d'insertion avec un SELECT sur une autre table
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 22h58

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