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 :

Redondance AND + OR


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Redondance AND + OR
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT message
    FROM messages
    WHERE (sender = 'XXX'
    AND recipient = 'YYY')
    OR (sender = 'YYY'
    AND recipient = 'XXX')
    Petit détail, petite question que je me posais...

    La requête ci-dessous est redondante. Existe-il des opérateurs ou des opérations SQL pour la simplifier ?

    Merci beaucoup !

    saenerys

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Je ne vois pas en quoi elle est redondante !

    La seule option qu'on pourrait imaginer, c'est quelque chose du genre (mais ce n'est pas vraiment "plus simple" ...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH paramFiltre AS 
    ( SELECT 'XXX' as Valeur1, 'YYY' as Valeur2 -- FROM DUAL pour Oracle
      UNION ALL
     SELECT 'YYY' as Valeur1, 'XXX' as Valeur2 -- FROM DUAL pour Oracle
    )
    SELECT message
    FROM messages m
            INNER JOIN paramFiltre  pF
                      ON (pF.Valeur1 = m.sender AND pF.Valeur2 = m.recipient)
    Ou encore pour ce cas particulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT message
    FROM messages
    WHERE sender IN ( 'XXX' , 'YYY')
    AND recipient IN ( 'XXX' , 'YYY')
    AND sender <> recipient

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT message
    FROM messages
    WHERE sender IN ( 'XXX' , 'YYY')
    AND recipient IN ( 'XXX' , 'YYY')
    AND sender <> recipient
    Perfect !

    Merci, c'est exactement ce que je recherchais. Oui, pas vraiment une question de redondance, plutôt de réduire la longueur des requêtes SQL.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Regardez bien le plan d'execution associé a cette nouvelel version, ca n'est pas sur que ce soit mieux que l'ancien.

    Sinon sur certain SGBD on peut utiliser cette approche (Oracle et db2 de mémoire, surement d'autre aussi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    where (col_1, col_2) in (('XXX', 'YYY'), ('YYY', 'XXX'))

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and concat(sender, recipient) in ('XXXYYY', 'YYYXXX')
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and concat(sender, recipient) in ('XXXYYY', 'YYYXXX')
    Mon index me dit que la base ne pourra pas utiliser le sien (d'index ! )...

    Tatayo.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pour la syntaxe (comprendre, pas pour les performances) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT message
      FROM messages
     WHERE 'XXX' IN (sender, recipient)
       AND 'YYY' IN (sender, recipient)
       AND sender <> recipient

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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 10h10
  2. [Look and feel] Texte des JLabels en gras
    Par aliasjcdenton dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 26/01/2006, 11h49
  3. mise en page (Header and Footer) en XML-XSL.
    Par christine dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/03/2004, 16h31
  4. SQL :select et AND
    Par Shabata dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/05/2003, 13h39
  5. Fip, modbus and co...
    Par xave dans le forum Développement
    Réponses: 2
    Dernier message: 24/05/2002, 13h25

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