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 :

Requête avec un ensemble de paramètres


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut Requête avec un ensemble de paramètres
    Bonjour,

    Prenons l'exemple de Clients/Commandes, un client a plusieurs commandes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    T_CLIENT
    ID | CODE_CLI
    1  | CLIENT_A
    2  | CLIENT_B
    3  | CLIENT_C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    T_COMMANDE
    ID | ID_CLT | CODE_COM
    1  |   1    | Souris
    2  |   1    | Clavier
    3  |   2    | Souris
    4  |   2    | Disque dur
    5  |   3    | Clavier
    6  |   3    | Souris
    7  |   3    | Ecran
    Je veux une requête SQL qui me permettra de récupérer les clients via les deux entrées "Souris" ET "Clavier". En fait, je dois extraire les clients qui ont commandé des souris et claviers à la fois.

    Est ce que c'est possible avec SQL ? si oui, pouvez-vous me donner une piste ?

    Merci pour votre aide.

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    SQL étant un langage complet au sens de Turing, il n'y a aucune limite d'utilisation du langage pour résoudre n'importe quel problème bien posé...
    À lire : http://fr.wikipedia.org/wiki/Turing-complet

    Pour votre problème il existe différentes solutions...

    1) faire deux requêtes et une intersection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT C.*
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.ID_CLI
    WHERE  M.CODE_COM = 'Souris'
    INTERSECT
    SELECT C.*
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.ID_CLI
    WHERE  M.CODE_COM = 'Clavier'
    2) demander ceux qui ont commandé les deux objets et compter si ce sont bien au moins deux objets différents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT C.*
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.ID_CLI
    WHERE  M.CODE_COM IN ('Souris', 'Clavier')
    GROUP  BY C.ID, C.CODE_CLI
    HAVING COUNT(DISTINCT CODE_COM) >= 2;
    Et pour vous former au langage SQL, mon site, comme mon bouquin, peuvent vous y aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Bonjour,

    Merci pour votre retour,

    Je constate que j'ai oublié d'ajouter un enregistrement pour le client 3 pour avoir les commandes : souris, clavier et écran. Mon premier post est mis à jour.

    En essayant la deuxième solution, qui est pour moi la plus simple (surtout que je peux avoir des dizaines de commandes dans la recherche), je n'arrive pas à avoir le résultat attendu qui est le client 1 parce que c'est le seul qui à commandé les deux objets 'Souris' et 'Clavier' seulement.

    A votre avis, existe il une autre piste ?

    Merci beaucoup.

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    dans ce cas ce n'est pas >= 2, mais =2 qu'il faut mettre dans le filtre de résultat HAVING...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Dites moi si je me trompe, mais à partir du moment où on a :
    - Une clause T_CLIENT AS C INNER JOIN T_COMMANDE AS M dans le FROM.
    - Une clause M.CODE_COM IN ('Souris', 'Clavier') dans le WHERE.
    - Une clause COUNT(DISTINCT CODE_COM) dans le HAVING.

    Qu'on mette => 2 ou = 2 ça devrait faire exactement la même chose puisque COUNT(DISTINCT CODE_COM) sera obligatoirement égal à 1 ou 2 (0 ne serait présent que si T_CLIENT AS C INNER JOIN T_COMMANDE AS M était remplacé par T_CLIENT AS C LEFT OUTER JOIN T_COMMANDE AS M et des valeurs suppérieures à 2 ne seraient présentent que si M.CODE_COM IN ('Souris', 'Clavier') n'était pas présent.

    Donc à part une erreur de compilation de la requête qu'aelmalki s'est bien gardé de nous préciser, je ne vois pas en quoi mettre = 2 à la place de => 2 pourrait bien changer.
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    @StringBuilder : je suis pour ton analyse, aucun changement avec l'=, parce que les clients 1 et 3 ont les deux 'Souris' et 'Clavier' comme commandes.

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    En fait, ce que tu veux, c'est les clients qui ont commandé une souris et un clavier et rien d'autre, c'est ça ?

    Dans ce cas, je dirais qu'il faut user de subtilité :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT C.ID
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.ID_CLI
    GROUP  BY C.ID, C.CODE_CLI
    HAVING sum(case CODE_COM when 'Clavier' then 0 when 'Souris' then 0 else 1 end) = 0 and sum(distinct code_dom) = 2;

    On peut certainement faire ça de façon bien différente.

    C'est à dire qu'on vérifie deux choses :
    - Que rien d'autre que "Clavier" et "Souris" ont été commandés
    - Qu'il y a 2 et seulement 2 références différentes qui ont été commandées
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Merci pour votre retour, oui c'est exactement ce que je veux.

    Je suis novice dans SQL, donc je prends vos réponses et j'essaye de comprendre un peu comment les implémenter.

    Si je met cette instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING sum(case CODE_COM when 'Clavier' then 0 when 'Souris' then 0 else 1 end) = 0
    Est ce que cette instruction devient alors inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND sum(DISTINCT code_dom) = 2
    Ce que j'ai compris : c'est que avec les cases, on récupère seulement les clients avec 'Clavier' et 'Souris', rien de plus.

    Qu'en pensez-vous ?

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par aelmalki Voir le message
    Est ce que cette instruction devient alors inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND sum(DISTINCT code_dom) = 2
    Ben non, sans cette clause, un client peut n'avoir commandé qu'une souris ou qu'un clavier mais pas les 2, par contre c'est un COUNT et pas une SUM.

  10. #10
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    @skuatamad : oui vous avez raison, bien vu pour le COUNT au lieu du SUM.

    En gros apparemment ça marche sur cet exemple, je vous remercie tous pour votre aide, je viens d'apprendre beaucoup de chose en SQL.

    Merci.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Plus optimisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT C.*
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.ID_CLI
    WHERE  M.CODE_COM IN ('Souris', 'Clavier')
      AND  (SELECT COUNT(DISTINCT CODE_COM)
            FROM   T_COMMANDE AS CD
            WHERE  CD.ID_CLI = C.ID) = 2;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Plus optimisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT C.*
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.ID_CLI
    WHERE  M.CODE_COM IN ('Souris', 'Clavier')
      AND  (SELECT COUNT(DISTINCT CODE_COM)
            FROM   T_COMMANDE AS CD
            WHERE  CD.ID_CLI = C.ID) = 2;
    La même en corrigée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT C.ID
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.ID_CLT
    WHERE  M.CODE_COM IN ('Souris', 'Clavier')
      AND  (SELECT COUNT(DISTINCT CODE_COM)
            FROM   T_COMMANDE AS CD
            WHERE  CD.ID_CLT = C.ID) = 2
    GROUP BY C.ID
    HAVING COUNT(DISTINCT CODE_COM)=2
    Je ne sais pas si elle est plus performante que celle de StringBuilder.

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Une autre solution, et cette fois ça devrait être ce qu'il y a de plus performant :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select c.id
    from t_client c
    inner join t_commande m on m.id_cli = c.id and m.code in ('Souris', 'Clavier')
    where not exists (select null from t_commande z where z.id_cli = c.id and z.code not in ('Souris', 'Clavier'))
    group by c.id
    having count(distinct m.code) = 2;
    On ne jouit bien que de ce qu’on partage.

  14. #14
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    (Grmpf)

    Je viens de faire un test sur SQL Server 2012 Express.

    Voici le script :
    Code sql : 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
     
    create table t_client
    (
    	id int identity not null primary key,
    	code_cli varchar(10) not null
    );
     
    create table t_commande
    (
    	id int identity not null primary key,
    	id_clt int not null references t_client(id),
    	code_com varchar(10) not null
    );
     
    insert into t_client (code_cli) values 
    ('Client 1'), 
    ('Client 2'), 
    ('Client 3'), 
    ('Client 4'), 
    ('Client 5');
     
    insert into t_commande (id_clt, code_com) values 
    (1, 'Clavier'), (1, 'Souris'), (1, 'Ecran'), (1, 'Clavier'), (1, 'Souris'), 
    (2, 'Clavier'), (2, 'Souris'), (2, 'Clavier'), 
    (3, 'Clavier'), (3, 'Clavier'), 
    (4, 'Ecran'), (4, 'Clavier'), 
    (5, 'Souris'), (5, 'Clavier');
     
    -- Première proposition de StringBuilder
    SELECT C.ID
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.id_clt
    GROUP  BY C.ID
    HAVING sum(case code_com when 'Clavier' then 0 when 'Souris' then 0 else 1 end) = 0 AND count(DISTINCT code_com) = 2;
     
    -- Première proposition de Fred_34
    SELECT C.ID
    FROM   T_CLIENT AS C
           INNER JOIN T_COMMANDE AS M
                 ON C.ID = M.id_clt
    WHERE  M.code_com IN ('Souris', 'Clavier')
      AND  (SELECT COUNT(DISTINCT code_com)
            FROM   T_COMMANDE AS CD
            WHERE  CD.id_clt = C.ID) = 2
    GROUP BY C.ID
    HAVING COUNT(DISTINCT code_com)=2;
     
    -- Seconde proposition de StringBuilder
    SELECT c.id
    FROM t_client c
    INNER JOIN t_commande m ON m.id_clt = c.id AND m.code_com IN ('Souris', 'Clavier')
    WHERE NOT EXISTS (SELECT NULL FROM t_commande z WHERE z.id_clt = c.id AND z.code_com NOT IN ('Souris', 'Clavier'))
    GROUP BY c.id
    HAVING count(DISTINCT m.code_com) = 2;

    Aucune des requêtes de SQLPro n'y figurent, car y'en a aucune qui retourne le bon résultat (pas en forme en ce moment...)

    Voici le plan d'exécution du lot en pièce jointe.

    Chose assez surprenante, ma première requête est la plus performance, talonnée par ma seconde proposition.
    Quant à la proposition de Fred_34 basée sur la suggestion de SQLPro, elle prend à elle toute seule plus de la moitié du lot.

    Moralité : j'ai peut-être pour habitude de travailler avec un MCD de merde et un SGBD qui vaut pas mieux, mais je sais tout de même écrire des requêtes performantes et qui marchent.
    Oui, je sais, le quidam est aigri, mais il est blessé.
    Images attachées Images attachées  
    On ne jouit bien que de ce qu’on partage.

  15. #15
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Pour mettre les requêtes dans une situation plus réaliste, j'ai aussi ajouté l'index suivant :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create index ix_code_com on t_commande (code_com);

    J'ai pas regardé en détail l'impact sur les plans d'exécution, mais les proportions restent les mêmes.

    En revanche, avec l'index suivant, on a des changements intéressants :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create index ix_code_com on t_commande (code_com, id_clt);

    En pièce jointe les nouveaux plans d'exécution.

    On remarque que ma première requête est alors complètement à la ramasse (elle passe à près de 50% du lot) alors que ma seconde ainsi que celle de Fred_34 deviennent à peu de chose aussi performantes l'une que l'autre.

    Etant donné que la seconde requête est dans les deux cas autour de 25% du lot, et donc qu'elle tire aussi bien parti de la présence d'index que de leur absence, je pense qu'il sera judicieux de privilégier cette syntaxe, qui a en plus l'avantage de couler de source.

    -- Edit : Je remarque aussi que la version "NOT IN" est légèrement plus performante que la version "NOT EXISTS" :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT c.id
    FROM t_client c
    INNER JOIN t_commande m ON m.id_clt = c.id AND m.code_com IN ('Souris', 'Clavier')
    WHERE c.id not in (SELECT z.id_clt FROM t_commande z WHERE z.id_clt = c.id AND z.code_com NOT IN ('Souris', 'Clavier'))
    GROUP BY c.id
    HAVING count(DISTINCT m.code_com) = 2;
    Images attachées Images attachées  
    On ne jouit bien que de ce qu’on partage.

  16. #16
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Un autre principe, en enrichissant le jeu de données.
    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
    with T_CLIENT as
    (select 1 ID,  'CLIENT_A'CODE_CLI from dual union
    select 2 ,  'CLIENT_B' from dual union
    select 3,   'CLIENT_C' from dual union
    select 4,   'CLIENT_D' from dual
    ), 
    T_COMMANDE as
    (
    select 1 ID,    1 ID_CLT    ,'Clavier' CODE_COM from dual union
    select 2     ,1     ,'Souris' from dual union
    select 3     ,2     ,'Souris' from dual union
    select 4     ,2     ,'Disque dur' from dual union
    select 5     ,3     ,'Clavier' from dual union
    select 6     ,3     ,'Souris' from dual union
    select 7     ,3     ,'Ecran' from dual union
    select 8     ,4     ,'Souris' from dual union
    select 9     ,4     ,'Clavier' from dual
     
    )
     
     
     
     
    select  C.ID_CLT,C.CODE_CLI from
    (
    select B.ID_CLT,A.CODE_CLI ,
     rtrim(REPLACE(REPLACE(XMLAgg(XMLElement("x", B.CODE_COM  ) ORDER BY B.CODE_COM ASC), '<x>', ''), '</x>', '+'), '+') article
     from T_client A join T_commande B on  A.ID=B.ID_CLT
     group by B.ID_CLT,A.CODE_CLI 
     
     )C
     where C.article='Clavier+Souris'
    Bon courage
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  17. #17
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    (Grmpf)
    Aucune des requêtes de SQLPro n'y figurent, car y'en a aucune qui retourne le bon résultat (pas en forme en ce moment...).
    Tu as raison : entorse il y a 5 semaines, plus sciatique il y a 10 jours... En sus de beaucoup trop de boulot !!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/05/2006, 17h00
  2. Réponses: 9
    Dernier message: 27/04/2006, 15h02
  3. [Oracle] - Requête avec paramètres
    Par b00tny dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/04/2006, 16h09
  4. test d'une requête avec paramètre
    Par hervé14670 dans le forum Access
    Réponses: 1
    Dernier message: 12/01/2006, 22h45
  5. [ADO/Access] Appel d’une requête avec des paramètres
    Par Taxenna dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/12/2004, 14h58

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