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 :

probleme requete pour tout afficher


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut probleme requete pour tout afficher
    Bonjour,

    J'ai une table A qui contient les valeur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    key value type
    1     X2    E
    2     X3    D
    3     X4    D
    et une table B qui contient des valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Value
    X2
    X6
    V32
    V45
    ce que je souhaiterai c'est avoir au final par exemple pour la clé 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1     X2    E  OK
    1     X6    null NOK 
    1     V32   null NOK
    1     V45   null NOK
    en faite si la valeur est presente dans la table B, je met OK
    et si elle n'est pas presente je ne met pas NOK

    j'ai essayer avec une jointure externe , mais le truc
    c est que ça me ramene toutes les lignes de la tables A simplement et pas celle de la table B;
    Pour la key = 1,
    j'aurai :
    Merci de votre aide

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    A priori, vous voulez croiser toutes les lignes de chaque table. Attention, si vos tables sont grosses, cela peut prendre un certain temps.

    Un simple DECODE comparant les valeurs suffit (j'ai mis X6 dans la table A pour bien voir le résultat):
    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
      WITH ta AS
           (SELECT 1 AS KEY, 'X2' AS VALUE, 'E' AS TYPE FROM DUAL UNION ALL
            SELECT 2,        'X6',          'D'         FROM DUAL UNION ALL
            SELECT 3,        'X4',          'D'         FROM DUAL),
           tb AS
           (SELECT 'X2' AS VALUE FROM DUAL UNION ALL
            SELECT 'X6'          FROM DUAL UNION ALL
            SELECT 'V32'         FROM DUAL UNION ALL
            SELECT 'V45'         FROM DUAL)
      SELECT ta.key, tb.value, ta.type, DECODE (ta.value, tb.value, 'OK', 'NOK')
        FROM ta, tb;
     
       KEY VAL T DEC
    ------ --- - ---
         1 X2  E OK
         1 X6  E NOK
         1 V32 E NOK
         1 V45 E NOK
         2 X2  D NOK
         2 X6  D OK
         2 V32 D NOK
         2 V45 D NOK
         3 X2  D NOK
         3 X6  D NOK
         3 V32 D NOK
         3 V45 D NOK

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    je ne comprends pas trop ton exemple,
    j'ai mis des valeurs a titre d exemple, les valeurs je ne suis pas censé les connaitre,mettre des valeurs en dure, ce n'est pas possible;
    avec le decode ,on sait si on met OK ou NOK
    mais le problème c'est comment pour la Key 1, je peux ramener toutes les valeurs de la table B.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Un minimum de réflexion est indispensable...

    Mes données en dur sont là pour montrer le résultat attendu.
    Pour la Key 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ta.KEY, tb.value, ta.type, DECODE (ta.value, tb.value, 'OK', 'NOK')
        FROM ta, tb
     WHERE ta.KEY = 1;

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    en faite tu fais un produit cartesien
    j'avais pensé à cela aussi
    mais le truc
    est que si j'ai 200 000 lignes dans ma tables A
    et 50 dans la table B
    ça risque de mettre une decennie.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par donny Voir le message
    en faite tu fais un produit cartesien
    j'avais pensé à cela aussi
    mais le truc
    est que si j'ai 200 000 lignes dans ma tables A
    et 50 dans la table B
    ça risque de mettre une decennie.
    Si de toute façon tu dois comparer avec chaque ligne, tu n'as pas vraiment le choix...

    Une autre façon d'écrire est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ta.KEY, tb.VALUE, ta.TYPE, 'OK'
      FROM ta, tb
     WHERE ta.KEY = 1 AND ta.VALUE = tb.VALUE
    UNION ALL
    SELECT ta.KEY, tb.VALUE, ta.TYPE, 'NOK'
      FROM ta, tb
     WHERE ta.KEY = 1 AND ta.VALUE <> tb.VALUE;
    Pas sûr que ça change grand chose au niveau des perfs. Il te faut un index sur les colonnes VALUE.

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    avec le union c'est bien
    mais le truc je viens de faire un test sur ma table
    et je me rend compte
    qu'on peut avoir plusieurs valeur pour une key !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    KEY value type
    1     X2    E
    1     X3    E
    2     X3    D
    3     X4    D
    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
     
    KEY	VALUE	TYPE	DECODE(TA.VALUE,TB.VALUE,'OK','NOK')
     
    1	X2	E	OK
    1	X6	E	NOK
    1	V32	E	NOK
    1	V45	E	NOK
    1	X2	E	NOK
    1	X6	E	NOK
    1	V32	E	NOK
    1	V45	E	NOK
    2	X2	D	NOK
    2	X6	D	OK
    2	V32	D	NOK
    2	V45	D	NOK
    3	X2	D	NOK
    3	X6	D	NOK
    3	V32	D	NOK
    3	V45	D	NOK
    et le souci
    c'est que le X2 va sortir plusieurs fois
    une fois en OK
    et n fois en NOK

    et c'est pas coherent

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    C'est cohérent avec ce que tu voulais au départ. Si les données ne te conviennent pas, c'est un autre problème.
    Ou bien il faut changer ta demande initiale.

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    c'est ma demande de depart qui est incomplete
    j'ai zapper ce cas
    en faite, la table A peut contenir cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    KEY value type
    1     X2    E
    1     X3    E
    2     X3    D
    3     X4    D
    et je souhaiterais
    pour key 1 par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1     X2    E  OK
    1     X3    E   NOK
    1     X6    NULL NOK 
    1     V32   NULL NOK
    1     V45   NULL NOK

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Voici une réponse (il y a peut-être plus simple).

    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
    WITH ta AS
         (SELECT 1 AS KEY, 'X2' AS VALUE, 'E' AS TYPE FROM DUAL UNION ALL
          SELECT 1 AS KEY, 'X3' AS VALUE, 'E' AS TYPE FROM DUAL UNION ALL
          SELECT 2,        'X3',          'D'         FROM DUAL UNION ALL
          SELECT 3,        'X4',          'D'         FROM DUAL),
         tb AS
         (SELECT 'X2' AS VALUE FROM DUAL UNION ALL
          SELECT 'X6'          FROM DUAL UNION ALL
          SELECT 'V32'         FROM DUAL UNION ALL
          SELECT 'V45'         FROM DUAL)
    SELECT ta.KEY, tb.VALUE, ta.TYPE, 'OK'
      FROM ta, tb
     WHERE ta.KEY = 1 AND ta.VALUE = tb.VALUE
    UNION ALL
    SELECT KEY, VALUE, TYPE, 'NOK'
      FROM (SELECT ta.KEY, tb.VALUE, ta.TYPE
              FROM ta, tb
             WHERE ta.KEY = 1 AND ta.VALUE <> tb.VALUE
            MINUS
            SELECT ta.KEY, tb.VALUE, ta.TYPE
              FROM ta, tb
             WHERE ta.KEY = 1 AND ta.VALUE = tb.VALUE);
     
    -- RESULTAT --
      KEY VAL T OK/NOK
    ----- --- - ---
        1 X2  E OK
        1 V32 E NOK
        1 V45 E NOK
        1 X6  E NOK

  11. #11
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    merci de tes réponses,
    c'est un peut compliquer mais le truc c'est que ça ne ramene pas le



  12. #12
    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
    J'ai un peu plus simple mais pour le moment elle ne marche que pour un id à la fois :
    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
    WITH ta AS
    (
    select 1 as key, 'X2' as value, 'E' as type from dual union all
    select 1       , 'X3'         , 'E'         from dual union all
    select 2,        'X3',          'D'         from dual union all
    select 3,        'X4',          'D'         from dual
    )
      ,  tb AS
    (
    select 'X2' as value from dual union all
    select 'X6'          from dual union all
    select 'V32'         from dual union all
    select 'V45'         from dual
    )
      select &key as key,
             coalesce(tb.value, ta.value) as value,
             ta.type,
             case when ta.key is null or tb.value is null then 'NOK' else 'OK' end as res
        from ta
             full outer join tb
               on tb.value = ta.value
              and ta.key = &key
       where ta.key is null or ta.key = &key
    order by key asc, to_number(substr(value, 2)) asc;
    Pour 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    KEY	VALUE	TYPE	RES
    1	X2	E	OK
    1	X3	E	NOK
    1	X6		NOK
    1	V32		NOK
    1	V45		NOK
    Pour 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    KEY	VALUE	TYPE	RES
    2	X2		NOK
    2	X3	D	NOK
    2	X6		NOK
    2	V32		NOK
    2	V45		NOK
    Pour 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    KEY	VALUE	TYPE	RES
    3	X2		NOK
    3	X4	D	NOK
    3	X6		NOK
    3	V32		NOK
    3	V45		NOK
    Pour 4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    KEY	VALUE	TYPE	RES
    4	X2		NOK
    4	X6		NOK
    4	V32		NOK
    4	V45		NOK

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Sans identifiant dans la table B, ce n'est pas évident d'écrire des conditions simples...

  14. #14
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    c'est clair sans identifiant c'est pas simple
    mais c'est comme ci dans une table on avait des couleurs et une autre des voiture
    et qu'on voulait faire toutes les combinaison de couleur par modele

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    clio 1.2 
    clio 1.3
    clio 1.5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    clio 1.2  bleu
    clio 1.2  vert
    clio 1.2  rouge
    clio 1.3  bleu
    clio 1.3  vert
    clio 1.3  rouge
    ...
    mon cas , il est pas evident

  15. #15
    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
    Voilà la requête ensembliste :
    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
    37
    38
    39
    40
    41
    WITH ta AS
    (
    select 1 as key, 'X2' as value, 'E' as type from dual union all
    select 1       , 'X3'         , 'E'         from dual union all
    select 2,        'X3',          'D'         from dual union all
    select 3,        'X4',          'D'         from dual
    )
      ,  tb AS
    (
    select 'X2' as value from dual union all
    select 'X6'          from dual union all
    select 'V32'         from dual union all
    select 'V45'         from dual
    )
      select coalesce(sr.key, ta.key) as key,
             coalesce(tb.value, ta.value) as value,
             ta.type,
             case when ta.key is null or tb.value is null then 'NOK' else 'OK' end as res
        from tb
             cross join (select distinct key from ta) sr
             full outer join ta
               on tb.value = ta.value
              and ta.key   = sr.key
    order by key asc, to_number(substr(value, 2)) asc;
     
    KEY	VALUE	TYPE	RES
    1	X2	E	OK
    1	X3	E	NOK
    1	X6		NOK
    1	V32		NOK
    1	V45		NOK
    2	X2		NOK
    2	X3	D	NOK
    2	X6		NOK
    2	V32		NOK
    2	V45		NOK
    3	X2		NOK
    3	X4	D	NOK
    3	X6		NOK
    3	V32		NOK
    3	V45		NOK

  16. #16
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    en faite je crois que je me suis un peu emeler les pinceaux

    si dans ma table A j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    KEY value type
    1     X2    E
    1     X3    E
    2     X3    D
    3     X4    D
    et que dans ma table B ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Value
    X2
    X6
    V32
    V45
    ce que je voudrais d'abord matcher les lignes pour lesquels la value
    existes dans la table B et leur mettre OK
    cela j'y arrive, il suffit de faire une jointure externe
    et un decode qui met OK si sa match et rien dans le cas contraire

    et ensuite ( ce que je n'arrive pas à faire)
    recupérer les key de la table A et leur rajouter les value qu'elle n'ont pas dans la table B avec NOK.
    recupéré les key c'est simple mais comment faire la jointure
    pour avoir cela (pour key 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1     X2    E OK
    1     X3    E NULL  
    1     X6   NULL NOK
    1     V32  NULL NOK
    1     V45  NULL NOK

  17. #17
    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
    Aucun problème avec ma requête, il suffit de changer le dernier case :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    WITH ta AS
    (
    select 1 as key, 'X2' as value, 'E' as type from dual union all
    select 1       , 'X3'         , 'E'         from dual union all
    select 2,        'X3',          'D'         from dual union all
    select 3,        'X4',          'D'         from dual
    )
      ,  tb AS
    (
    select 'X2' as value from dual union all
    select 'X6'          from dual union all
    select 'V32'         from dual union all
    select 'V45'         from dual
    )
      select coalesce(sr.key, ta.key) as clef,
             coalesce(tb.value, ta.value) as val,
             ta.type,
             case
               when ta.key   is null then 'NOK'
               when tb.value is null then null
               else 'OK'
             end as res
        from tb
             cross join (select distinct key from ta) sr
             full outer join ta
               on tb.value = ta.value
              and ta.key   = sr.key
    order by clef asc, to_number(substr(val, 2)) asc;
     
     
    CLEF	VAL	TYPE	RES
    1	X2	E	OK
    1	X3	E	
    1	X6		NOK
    1	V32		NOK
    1	V45		NOK
    2	X2		NOK
    2	X3	D	
    2	X6		NOK
    2	V32		NOK
    2	V45		NOK
    3	X2		NOK
    3	X4	D	
    3	X6		NOK
    3	V32		NOK
    3	V45		NOK

Discussions similaires

  1. [AC-2010] Paramètre pour tout afficher
    Par cyr.odi dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 21/03/2012, 14h48
  2. Réponses: 5
    Dernier message: 17/10/2008, 09h33
  3. Probleme requete pour lister les banques de boites aux lettres
    Par spykopat dans le forum Exchange Server
    Réponses: 1
    Dernier message: 20/08/2007, 11h56
  4. [WebForms]Afficher toujours le même URL pour toutes mes pages
    Par Irish dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 15/12/2006, 14h44
  5. Probleme de requete pour remplir les champs d'une table
    Par Jim_Nastiq dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/04/2006, 14h56

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