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 :

(curiosité) IN SELECT de plusieurs colonnes


Sujet :

Langage SQL

  1. #1
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut (curiosité) IN SELECT de plusieurs colonnes
    Bonjour,

    Juste par curiosité car j'ai une solution mais elle est à ralonge et je me demandais si il n'y avait pas moyen de faire plus court.
    Je montre directement la requête pour plus de compréhension:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT T1.id
    FROM Table1 T1
    WHERE valeur = T1.login
    OR valeur IN
    (
       SELECT T2.Champ1
       FROM Table2 T2
       WHERE T2.id = T1.id
    );
    Seulement, ma valeur peut se retrouver également dans T2.Champ2, T2.Champ3, etc.
    Ma question est : "est-il possible d'éviter de devoir recopier le bloc OR ?".

    Donc pour écrire une grossierté du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT T1.id
    FROM Table1 T1
    WHERE valeur = T1.login
    OR valeur UN_OPERATEUR
    (
       SELECT T2.Champ1, T2.Champ2, T2.Champ3
       FROM Table2 T2
       WHERE T2.id = T1.id
    );

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    peut être quelque chose dans ce genre?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T1.id
    FROM Table1 T1 
    JOIN Table2 T2
    ON T2.id = T1.id
    WHERE valeur = T1.login
    OR valeur IN (T2.Champ1, T2.Champ2, T2.Champ3)

  3. #3
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    Heu, oui, merci.
    Ma requête est effectivement plus petite.
    Mais niveau performance, c'est kif kif, non ?
    Je fais autant de select dans les deux cas ?

  4. #4
    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 !

    Effectivement, c'est là que se situe la différence entre une jointure et un IN ou EXISTS.

    D'ailleurs, en utilisant EXISTS à la place de IN, la corrélation te donne plus de souplesse pour faire ce que tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT T1.id
    FROM Table1 T1
    WHERE valeur = T1.login
      AND EXISTS
    (
       SELECT NULL
       FROM Table2 T2
       WHERE T2.id = T1.id
         AND (valeur in (T2.champs1,T2.champs2,T2.champs3))
    );

  5. #5
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    Ha oui. Merci.

    Sinon, pour Oracle 10g, il y a moyen de faire ceci, mais c'est uniquement pour vérifier des couples de valeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT T1.id
    FROM Table1 T1
    WHERE valeur = T1.login
    OR (valeur1,valeur2) IN
    (
       SELECT T2.Champ1, T2.Champ2
       FROM Table2 T2
       WHERE T2.id = T1.id
    );
    Il me sortira les lignes où valeur1 = Champ1 ET valeur2 = Champ2.

    Bien bien, je pense qu'on a trouvé plusieurs possibilités. C'est bien aimable à vous.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 07/03/2011, 16h18
  2. requête select de plusieurs colonnes de tables différentes
    Par lahmar.abdel1 dans le forum Général Java
    Réponses: 4
    Dernier message: 23/04/2010, 16h44
  3. Selection de plusieurs colonnes
    Par mhamedbj dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/12/2007, 16h28
  4. Selection de plusieurs colonnes avec une zone de liste
    Par vinzeffect dans le forum Access
    Réponses: 3
    Dernier message: 20/01/2007, 22h51
  5. Select sur plusieurs colonnes
    Par Mynautor dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/03/2006, 14h49

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