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 :

Listes ensemblistes de tables [11g]


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Listes ensemblistes de tables
    Bonjour,

    j'aurais besoin d'une aide pour une requête particulière. Je n'ai pas trouvé de solution et j'avoue sécher.

    Je veux ramener des informations de deux tables possédant un même champ sur une ligne par valeur de clé (dans l'exemple, les clés sont CA et CB)
    Un produit cartésien ne convient pas, ni des Inner join.

    Voici mes tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with ta as (
    select 'c1' as ca, 'v1' as va from dual union all
    select 'c1' as ca, 'v2' as va from dual union all
    select 'c1' as ca, 'v3' as va from dual union all
    select 'c2' as ca, 'v8' as va from dual ),
    tb as (
    select 'c1' as cb, 'w1' as vb from dual union all
    select 'c2' as cb, 'w2' as vb from dual union all
    select 'c2' as cb, 'w3' as vb from dual union all
    select 'c3' as cb, 'w8' as vb from dual )
    select * from ta, tb
    Table ta
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CA VA
    -- --
    c1 v1 
    c1 v2 
    c1 v3 
    c2 v8
    Table Tb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CB VB
    -- --
    c1 w1 
    c2 w2 
    c2 w3 
    c3 w8
    Le nombre de lignes pour une même valeur de clé n'est pas le même dans les deux tables et aucune des deux tables n'est considérée comme principale.

    J'aimerais obtenir le résultat suivant, via une seule requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CA_CB VA VB
    ----- -- --
    c1    v1 w1 
    c1    v2    
    c1    v3    
    c2    v8 w1 
    c2       w2 
    c2       w3 
    c3       w8
    Merci pour votre aide.

  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
    Avec un FULL OUTER JOIN, le row_number est à adapter en fonction du besoin car le résultat voulu contient une erreur :
    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 ta AS (
      2  SELECT 'c1' AS ca, 'v1' AS va FROM dual union ALL
      3  SELECT 'c1' AS ca, 'v2' AS va FROM dual union ALL
      4  SELECT 'c1' AS ca, 'v3' AS va FROM dual union ALL
      5  SELECT 'c2' AS ca, 'v8' AS va FROM dual ),
      6  tb AS (
      7  SELECT 'c1' AS cb, 'w1' AS vb FROM dual union ALL
      8  SELECT 'c2' AS cb, 'w2' AS vb FROM dual union ALL
      9  SELECT 'c2' AS cb, 'w3' AS vb FROM dual union ALL
     10  SELECT 'c3' AS cb, 'w8' AS vb FROM dual
     11  ),
     12  rn_ta as (
     13  select ca, va, row_number() over(partition by ca order by va) as rn
     14    from ta
     15  ),
     16  rn_tb as (
     17  select cb, vb, row_number() over(partition by cb order by vb) as rn
     18    from tb
     19  )
     20  select coalesce(t1.ca,t2.cb) as ca_cb, t1.va, t2.vb
     21    from rn_ta t1
     22    full join rn_tb t2 on t2.cb = t1.ca and t2.rn = t1.rn
     23   order by ca_cb, va, vb;
     
    CA VA VB
    -- -- --
    c1 v1 w1
    c1 v2
    c1 v3
    c2 v8 w2
    c2    w3
    c3    w8
     
    6 rows selected.
     
    SQL>

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup !! C'est pile poil ce qu'il me faut
    J'avais cherché du côté du row_number() mais sans aboutir.

    Effectivement, il y a une erreur dans la liste attendue, que la requête proposée ne produit pas.

    Bonne journée.

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

Discussions similaires

  1. liste déroulante et table
    Par Raphaëlle dans le forum Access
    Réponses: 7
    Dernier message: 04/07/2006, 11h44
  2. Liste déroulante et table Access
    Par specialfox dans le forum Access
    Réponses: 3
    Dernier message: 08/06/2006, 03h15
  3. Réponses: 9
    Dernier message: 04/04/2006, 16h59
  4. Réponses: 7
    Dernier message: 06/03/2006, 15h38
  5. SQL 2000 - Liste + taille des tables et index
    Par Fox dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2004, 15h59

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