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 :

problème avec liste de valeur


Sujet :

SQL Oracle

  1. #1
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut problème avec liste de valeur
    bonjour,

    la requête suivante peut être executée :

    select prenom
    from table_prenom
    where prenom in ('cedric','fabien');

    Mais le contraire est il possible (je n'arrive pas à le faire..), c'est à dire trouver dans la table table_prenom les prenom qui ne sont pas dans ma liste de valeur.

    quelque chose comme ceci (ça ne marche pas):

    select * from ('cedric','fabien') from dual
    where not in table_prenom.prenom

    merci d'avance

  2. #2
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select prenom
    from table_prenom
    where prenom NOT in ('cedric','fabien');

  3. #3
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    fatsora, merci de ton intérècement à mon problèm mais ce n'est pas ça que je souhaite faire

    je vais ré-expliquer :

    adméton:
    - ma liste : ('A','B','C')
    - ma table : ('A','B','D','E','F') (on va dire qu'elle s'appele Alpha avec LETTRE comme colone)

    la première requette que j'ai présenté :

    select LETTRE
    from Alpha where
    LETTRE in ('A','B','C')

    nous donne : 'A' | 'B' logiquement
    moi je veux l'inverse de ça : donc 'C' qui existe dans ma liste mais pas dans la table

    Maintenant ta requette donnera (si sauf erreur de ma part..)

    select LETTRE
    from Alpha where
    LETTRE not in ('A','B','C')

    nous donne : 'D', 'E' , 'F' (et nom pas 'C')


    la question est : comment tournée ma requette pour que le résultat soi 'C'

    j'espère avoir été claire, sinon redemander moi..

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il faut transformer la liste dans une table en ensuite c'est 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
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 
    Connected as mni
     
    SQL> 
    SQL> With list as (
      2    Select 'A' lettre from dual union all
      3    Select 'B' lettre from dual union all
      4    Select 'C' lettre from dual
      5  ), data as
      6  (
      7    Select 'A' lettre from dual union all
      8    Select 'B' lettre from dual union all
      9    Select 'D' lettre from dual union all
     10    Select 'E' lettre from dual union all
     11    Select 'F' lettre from dual
     12  )
     13  Select list.lettre, data.lettre
     14    from list
     15         left outer join
     16         data on(data.lettre = list.lettre)
     17  Where data.lettre is null
     18  /
     
    LETTRE LETTRE
    ------ ------
    C      
     
    SQL>
    Pour transformer la liste cherche split sur le forum Oracle SQL ou PL/SQL

  5. #5
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Bonjour,

    Je ne sais pas si le sujet précis est bien de remonter les écarts entre la liste 1 et une table 2 ?

    En hypothèse :

    une table 1 avec A B C
    une table 2 avec A B D E F

    select * from table1 t1
    where t1.lettre NOT IN (Select lettre From table2)
    Renvoi bien C. Soit les elements présents dans la table 1 et non dans la table 2.

    Il faut donc voir si tu peux charger ta liste dans une table temporaire Oracle.

    De mémoire je crois qu'une table temporaire se crée comme suivant :

    CREATE GLOBAL TEMPORARY TABLE today_sales
    ON COMMIT PRESERVE ROWS
    AS SELECT * FROM orders WHERE order_date = SYSDATE;
    Va voir le lien suivant :
    http://oracle.developpez.com/guide/a...es/?page=Chap4

    Cela peut t'aider.

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il n'y a nul besoin d'une table temporaire
    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
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.5.0 
    Connected as mni
     
    SQL> 
    SQL> WITH t AS (
      2    SELECT 'A,B,C' lettre FROM dual
      3  ), list As
      4  (
      5    SELECT extractvalue(COLUMN_VALUE,'/x') AS lettre
      6    FROM t,
      7   TABLE( xmlsequence(EXTRACT(XMLTYPE('<list><x>'|| REPLACE(lettre,',','</x><x>') ||'</x></list>')
      8          , '/list/x')))
      9  )
     10  , Data As
     11  (
     12      SELECT 'A' lettre FROM dual union ALL
     13      SELECT 'B' lettre FROM dual union ALL
     14      SELECT 'D' lettre FROM dual union ALL
     15      SELECT 'E' lettre FROM dual union ALL
     16      SELECT 'F' lettre FROM dual
     17  )
     18  SELECT list.lettre, DATA.lettre
     19    FROM list
     20    LEFT OUTER JOIN
     21         DATA ON(DATA.lettre = list.lettre)
     22    WHERE DATA.lettre IS NULL
     23  /
     
    LETTRE                                                                           LETTRE
    -------------------------------------------------------------------------------- ------
    C

  7. #7
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    mnitu , tu fais comment si la liste que tu as en entrée n'est pas toujours la même ?

    Ta solution me semble un peu figé par rapport à la liste en entrée non ?

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par beegood Voir le message
    mnitu , tu fais comment si la liste que tu as en entrée n'est pas toujours la même ?

    Ta solution me semble un peu figé par rapport à la liste en entrée non ?
    Je ne vois pas où est le problème (Varying in lists...).

  9. #9
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Je trouve la solution très interessante , et je ne conaissais pas.

    Mais dans l'hypothèse ou on se place dans une fonction pl/sql, la liste est passée en paramétres par exemple.

    Dans cette partie :
    SELECT 'A,B,C' lettre FROM dual
    'A,B,C' peut être ton paramètre. La cela va.

    Mais pour :

    SELECT 'A' lettre FROM dual union ALL
    13 SELECT 'B' lettre FROM dual union ALL
    14 SELECT 'D' lettre FROM dual union ALL
    15 SELECT 'E' lettre FROM dual union ALL
    16 SELECT 'F' lettre FROM dual
    Si tu ne connais pas le contenu de ta table ou si elle fait > 100 lignes , tu fais comment pour rendre cette partie dynamique ?

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    En fait, ce passage représente la table.
    Mnitu utilise cette forme à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE Alpha ...
    INSERT INTO ALPHA VALUES ..
    INSERT INTO ALPHA VALUES ..
    INSERT INTO ALPHA VALUES ..
    INSERT INTO ALPHA VALUES ..
    => Ca te permet de tester la requête même sur un environnement où tu n'aurais pas le droit de créer d'objet.


  11. #11
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par beegood Voir le message
    Je trouve la solution très interessante , et je ne conaissais pas.

    Mais dans l'hypothèse ou on se place dans une fonction pl/sql, la liste est passée en paramétres par exemple.

    Dans cette partie :


    'A,B,C' peut être ton paramètre. La cela va.

    Mais pour :



    Si tu ne connais pas le contenu de ta table ou si elle fait > 100 lignes , tu fais comment pour rendre cette partie dynamique ?
    oui en fait c'est avec cette remarque dans la tête que j'ai posté la question sur le forum, la solution de mnitu est bonne mais je pensai que l'on
    pouvais d'une manière ou d'une autre faire la requête avec la liste de valeur.. parce que dans mon cas c'est une liste de 1500 lignes..
    mais bon, ça n'est pas faisable techniquement je pense, et la réponse donnée est ce que je pensai au début. je vous remercie en tout cas pour l'aide apporté.

  12. #12
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Points : 47
    Points
    47
    Par défaut
    Bonsoir
    Euh petite idée avant d'aller dormir
    Est ce qu'un
    MINUS ne pourrait pas convenir (c'est pas dans la norme Sql mais bon) ?
    du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT prenom FROM TaTable MINUS TaListeDeValeur
    Bonne continuation

  13. #13
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Golgotha,

    Essaye de charger tes données de comparaison dans une table intermédiaire. c'est peut être plus long ou moins Sexy et encore cela reste à voir.

Discussions similaires

  1. [VB6] boucle for avec liste de valeur defini
    Par Morpheus2144 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/04/2006, 18h12
  2. Réponses: 20
    Dernier message: 22/03/2006, 14h00
  3. Problème avec liste déroulante
    Par Invité dans le forum IHM
    Réponses: 2
    Dernier message: 14/12/2005, 21h04
  4. Problème avec Me.RecordSource : valeur non conforme
    Par Tchupacabra dans le forum Access
    Réponses: 6
    Dernier message: 02/12/2005, 17h01
  5. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10

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