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

Développement SQL Server Discussion :

Besoins d'aide avec une requête de "non correspondance"


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Besoins d'aide avec une requête de "non correspondance"
    Bonjour à tous,
    Cela fait deux jours que je reste bloque sur une requête qui commence à me sortir par les narines.
    Je suis persuadé que c'est tout bête mais je n'arrive plus à réfléchir correctement, si quelqu'un a un idée pour parvenir à ce que je cherche, je lui en serait reconnaissant.

    Je dispose de deux tables, une qui contient une liste d'objet sous la forme
    ListeObjets
    {
    ID varchar(8)
    }
    et une autre qui contiens des clients avec les objets qu'ils ont achetés:
    ObjetsAchete
    {
    IDObjet varchar(8)
    ClientName varchar(8)
    }


    Je cherche à faire une requête indiquant quels objets les clients n'ont pas achetés.
    J'ai essayé de faire une jointure gauche entre la liste des objets et les objets acheter et de ne garder que les résultats "NULL", mais sans succès.
    J'aimerais que le résultat soit transmis sous cette forme:
    ClientName, IDObjetNonAchete

    ex:
    client1, 1
    client1, 2
    client2, 1
    client2, 3
    ...

    Merci par avance pour vos idées !

  2. #2
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Bonjour,

    Certainement, il te maque une table des clients. Dans une exemple ci-dessous on la crée par "SELECT DISTINCT ClientName FROM ObjetsAchete".
    D'autre part il vaut mieux éviter les sous-requêtes comme EXISTS() et essayer de réfléchir en termes des ensembles.

    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
    USE tempdb
    CREATE TABLE ListeObjets (
        ID varchar(8) PRIMARY KEY
    );
    CREATE TABLE ObjetsAchete (
        IDObjet varchar(8),
        ClientName varchar(8)
    );
    GO
    INSERT INTO ListeObjets
    VALUES ('prod01'), ('prod02'), ('prod03');
    INSERT INTO ObjetsAchete
    VALUES ('prod03', 'client1'), ('prod03', 'client1'), ('prod02', 'client2');
    GO
     
    SELECT oc.ClientName, oc.ID
    FROM (
        SELECT o.ID, c.ClientName
        FROM ListeObjets o CROSS JOIN (SELECT DISTINCT ClientName FROM ObjetsAchete) c
        ) oc
        LEFT OUTER JOIN ObjetsAchete a ON oc.ID = a.IDObjet AND oc.ClientName = a.ClientName
    WHERE a.IDObjet IS NULL
    GO
     
    DROP TABLE ObjetsAchete;
    DROP TABLE ListeObjets;
    GO

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Serguei_TARASSOV Voir le message
    Bonjour,

    Certainement, il te maque une table des clients. Dans une exemple ci-dessous on la crée par "SELECT DISTINCT ClientName FROM ObjetsAchete".
    D'autre part il vaut mieux éviter les sous-requêtes comme EXISTS() et essayer de réfléchir en termes des ensembles.

    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
    USE tempdb
    CREATE TABLE ListeObjets (
        ID varchar(8) PRIMARY KEY
    );
    CREATE TABLE ObjetsAchete (
        IDObjet varchar(8),
        ClientName varchar(8)
    );
    GO
    INSERT INTO ListeObjets
    VALUES ('prod01'), ('prod02'), ('prod03');
    INSERT INTO ObjetsAchete
    VALUES ('prod03', 'client1'), ('prod03', 'client1'), ('prod02', 'client2');
    GO
     
    SELECT oc.ClientName, oc.ID
    FROM (
        SELECT o.ID, c.ClientName
        FROM ListeObjets o CROSS JOIN (SELECT DISTINCT ClientName FROM ObjetsAchete) c
        ) oc
        LEFT OUTER JOIN ObjetsAchete a ON oc.ID = a.IDObjet AND oc.ClientName = a.ClientName
    WHERE a.IDObjet IS NULL
    GO
     
    DROP TABLE ObjetsAchete;
    DROP TABLE ListeObjets;
    GO
    Merci beaucoup Serguei_TARASSOV !
    C'est exactement ce que je cherchais.

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

Discussions similaires

  1. Besoin d'aide sur une requête avec un MAX()
    Par lcristin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/03/2013, 14h57
  2. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  3. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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