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 :

petit problème d'ensemble


Sujet :

Langage SQL

  1. #1
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut petit problème d'ensemble
    Bonjour,

    Soit deux ensembles 1 et 2. Je souhaite avoir l'intersection de ces ensembles sur l'ensemble 1 n'est pas vide et uniquement l'ensemble 2 si l'ensemble 1 est vide.

    En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (select 'A' val from dual)
    MON OPERATEUR
    (select 'A' val from dual
    union all
    select 'B' val from dual)
    doit renvoyer A

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (select null val from dual)
    MON OPERATEUR
    (select 'A' val from dual
    union all
    select 'B' val from dual)
    doit renvoyer
    A
    B

    Si vous avez des idées je suis preneur.

    La base finale est une base Oracle.

    PS : INTERSECT n'est pas la solution.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 109
    Points : 28 437
    Points
    28 437
    Par défaut
    Quelque chose de ce genre là :
    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
    SELECT  *
    FROM    (   SELECT  *
                FROM    ensemble1
            INTERSECT
                SELECT  *
                FROM    ensemble2
            )   AS  inter
    UNION 
        SELECT  *
        FROM    ensemble2
        WHERE   NOT EXISTS
                (   SELECT  *
                    FROM    ensemble1
                )
    ;

  3. #3
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    merci beaucoup, je savais bien que c'était faisable .

    sur le papier cela correspond à ce que je veux merci mille fois.

    je regarde demain pour l'intégrer dans ma requete

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 113
    Points : 31 590
    Points
    31 590
    Billets dans le blog
    16
    Par défaut
    Je n'ai guère l'occasion d'utiliser Oracle, mais je pense qu'on pourrait éviter une étape de tri inutile, en remplaçant UNION par UNION ALL. Un petit EXPLAIN pourrait être le bienvenu pour vérifier l'intérêt de la chose.
    Votre avis al1_24 ?

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 109
    Points : 28 437
    Points
    28 437
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Je n'ai guère l'occasion d'utiliser Oracle, mais je pense qu'on pourrait éviter une étape de tri inutile, en remplaçant UNION par UNION ALL.
    En effet, un UNION ALL pourrait intrinsèquement améliorer légèrement les temps d'exécution, d'autant que l'un des membres de l'union est toujours vide.
    Toutefois, il convient de ne pas oublier que UNION ALL n'est pas défini dans la norme SQL-2003.
    Citation Envoyé par fsmrel Voir le message
    Un petit EXPLAIN pourrait être le bienvenu pour vérifier l'intérêt de la chose.
    Cela va sans dire...
    Mais tous les développeurs SQL consultent le plan d'exécution de leurs requêtes pour réfléchir à leur optimisation

  6. #6
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    J'ai mis un union all.

    Voici le code fourni

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (select * from e1 
    intersect 
    select * from e2) 
    union all 
    (select * from e2 where not exists (select * from e1))
    Autre codes possibles qui fonctionnent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from e1 where exists (select * from e1)
    union all
    select * from e2 where not exists (select * from e1)
    qui fonctionne car e1 est inclus dans e2 (vous ne le saviez pas )

    et pour finir, une variante de la solution fournie ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (select * from e1 
    intersect 
    select * from e2) 
    union all 
    (select * from e2 where (select count(*) from e1)=0)
    Merci à tous,

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    si tu utilises Oracle, on peut se débrouiller avec les fct analytiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     select attr1, attr2, ... from (
        select min(cle) over() cle_min, ensembles.* from ( 
            (select 1 cle, attr1, attr2, ... from ...)  -- ensemble 1
            union all
            (select 2 cle, attr1, attr2, ... from ...)  -- ensemble 2
        ) ensembles
    ) where cle_min = cle;
    Tu enrichis la projection de tes deux ensembles par une "clé" : 1 pour l'ensemble 1, 2 pour l'ensemble ... 2,
    et tu projettes en amont l'ensemble dont la clé est la + petite, grace à la fct analytique min() nous gardons tous les tuples.

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

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 20h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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