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

MS SQL Server Discussion :

plusieurs colonnes avec opérateur IN


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 11
    Points : 7
    Points
    7
    Par défaut plusieurs colonnes avec opérateur IN
    Salut à tous,

    Qu'un pourrait-il me dire s'il est possible d'utiliser par exemple une paire de colonnes avec l'opérateur IN, exemple :

    select *
    from personne
    where (nom,prenom) in
    select nom,prenom
    from employes

    ceci est-il possible avec sql server ?
    si oui, merci de me communiquer la syntaxe juste, sinon c'est bien dommage !

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 904
    Points : 51 649
    Points
    51 649
    Billets dans le blog
    6
    Par défaut
    Oui en concaténant. Sinon avec EXISTS, INTERSECT, une jointure... Il existe de nombreuses manières... Un peu d'imagination que diable !

    Démo :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    CREATE TABLE T_CLIENT_CLI
    (CLI_ID      INT NOT NULL PRIMARY KEY IDENTITY,
     CLI_NOM     VARCHAR(16),
     CLI_PRENOM  VARCHAR(16))
     
    INSERT INTO T_CLIENT_CLI VALUES ('FREDERIC', 'BROUARD')
    INSERT INTO T_CLIENT_CLI VALUES ('FRED', 'ERICERAMZY')
    INSERT INTO T_CLIENT_CLI VALUES ('PAUL', 'DUPONT')
    INSERT INTO T_CLIENT_CLI VALUES ('PAUL', NULL)
    INSERT INTO T_CLIENT_CLI VALUES (NULL, NULL)
     
    CREATE TABLE T_PROSPECT_PSP
    (PSP_ID      INT NOT NULL PRIMARY KEY IDENTITY,
     PSP_NOM     VARCHAR(16),
     PSP_PRENOM  VARCHAR(16))
     
    INSERT INTO T_PROSPECT_PSP VALUES ('FREDERIC', 'BROUARD')
    INSERT INTO T_PROSPECT_PSP VALUES ('FREDERIC', 'ERAMZY')
    INSERT INTO T_PROSPECT_PSP VALUES ('MARC', 'DUPONT')
    INSERT INTO T_PROSPECT_PSP VALUES ('PAUL', 'DUBOIS')
    INSERT INTO T_PROSPECT_PSP VALUES (NULL, 'DUBOIS')
    INSERT INTO T_PROSPECT_PSP VALUES ('PAUL', NULL)
    INSERT INTO T_PROSPECT_PSP VALUES (NULL, NULL)
     
    -- première tentative :
    SELECT *
    FROM   T_CLIENT_CLI
    WHERE  CLI_NOM + CLI_PRENOM IN (SELECT PSP_NOM + PSP_PRENOM 
                                    FROM T_PROSPECT_PSP)
     
    CLI_ID      CLI_NOM          CLI_PRENOM       
    ----------- ---------------- ---------------- 
    1           FREDERIC         BROUARD
    2           FRED             ERICERAMZY
    -- mauvaises réponses : la concaténation en VARCHAR à provoqué un téléscopage de données et
    -- touvé une valeur absurde !
     
    -- transtypaons avec un CHAR d'un caractère plus large :
    SELECT *
    FROM   T_CLIENT_CLI
    WHERE  CAST(CLI_NOM AS CHAR(17)) + CAST(CLI_PRENOM AS CHAR(17)) 
           IN (SELECT CAST(PSP_NOM AS CHAR(17)) + CAST(PSP_PRENOM AS CHAR(17)) 
               FROM T_PROSPECT_PSP)
     
    CLI_ID      CLI_NOM          CLI_PRENOM       
    ----------- ---------------- ---------------- 
    1           FREDERIC         BROUARD
    --> excellent réponse
     
    -- avec un EXISTS (plus relationnel):
    SELECT *
    FROM   T_CLIENT_CLI C
    WHERE  EXISTS(SELECT * 
                  FROM   T_PROSPECT_PSP P
                  WHERE  P.PSP_NOM = C.CLI_NOM
                    AND  P.PSP_PRENOM = C.CLI_PRENOM )
     
    -- plus simple avec un INTERSECT (version 2005)
    SELECT CLI_NOM, CLI_PRENOM
    FROM   T_CLIENT_CLI
    INTERSECT
    SELECT PSP_NOM, PSP_PRENOM
    FROM   T_PROSPECT_PSP
     
    -- plus simple encore avec une jointure :
    SELECT C.*
    FROM   T_CLIENT_CLI C
           INNER JOIN T_PROSPECT_PSP P
                 ON P.PSP_NOM = C.CLI_NOM
                    AND  P.PSP_PRENOM = C.CLI_PRENOM
    A +

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    oui..biensûr... j'ai oublié d'ajouter dans mon message "autrement qu'en concaténant ou avec l'opérateur exists...". Je pensais qu'il serait possible de le faire simplement avec l'opérateur IN. Il me semble l'avoir déjà vu avec d'autres SGBD.
    Thankx anyway pour la démo

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 904
    Points : 51 649
    Points
    51 649
    Billets dans le blog
    6
    Par défaut
    Vous avez raison, cela s'apelle le Row Value Constructor. Mais il n'est pas implémenté dans SQL Server 2000 ni 2005. Peut être dans une version future car c'est une forte demande de la communauté des utilisateurs.
    http://sql.developpez.com/sqlaz/select/#L8

    A +

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/12/2007, 22h23
  2. Selectionner plusieurs colonnes avec distinct
    Par godjojo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/10/2007, 14h21
  3. Selection de plusieurs colonnes avec une zone de liste
    Par vinzeffect dans le forum Access
    Réponses: 3
    Dernier message: 20/01/2007, 22h51
  4. Requête à plusieurs colonnes avec la fonction COUNT
    Par zigune dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/11/2004, 10h43
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

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