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 SQL : filtrer des élements


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut Requête SQL : filtrer des élements
    Bonjour,

    Je dispose de deux tables PERSONNE et DENOMINATION. La première contient deux clés primaires : un code client IDCLIENT (visible par le client) et un identifiant commercial (interne à l'application) OID. Cet OID est une clé étrangère dans DENOMINATION.

    Le table DENOMINATION est celle qui contient les informations personnelles du client. Lorsqu'un client change d'adresse ou modifie des informations, une nouvelle DENOMINATION est créée, la précédente étant invalidée par le remplissage d'un champ de type DATE : DTINVALIDATION.

    Lorsqu'un client résilie son contrat, le champ DTINVALIDATION de sa dénomination active est rempli. Normalement, toutes ses dénominations sont désormais invalidées.

    Maintenant la question : je voudrais faire une requête pour trouver les clients dont TOUTES les dénominations ont leurs DTINVALIDATION à NOT NULL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT P.IDCLIENT, P.OID FROM PERSONNE P, DENOMINATION D
    WHERE
    P.OID = D.OID AND
    P.IDCLIENT IN (liste d'idenfiants) AND
    <toutes les dénominations de DENOMINATION D1 NOT NULL avec D.OID  = D1.OID>
    Si quelqu'un pouvait m'aider , je le remercie d'avance.

    Cordialement.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 463
    Par défaut
    Bonjour,
    Il faut juste reformuler la demande:
    je voudrais faire une requête pour trouver les clients pour lesquels il n'existe pas de dénominations dont DTINVALIDATION est NULL.

    Tatayo.

  3. #3
    Membre chevronné
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Par défaut
    La clause NOT EXISTS devrait résoudre le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT P.IDCLIENT, P.OID FROM PERSONNE P
    WHERE NOT EXISTS
        (
            SELECT 1 FROM DENOMINATION D WHERE D.OID = P.OID
            AND D.DTINVALIDATION IS NULL
        )

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    Billets dans le blog
    1
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT P.IDCLIENT, P.OID /*, COUNT(D.OID) */
    FROM PERSONNE P
    LEFT OUTER JOIN DENOMINATION D ON P.OID = D.OID AND D.DTINVALIDATION IS NULL
    WHERE P.IDCLIENT IN (liste d'idenfiants)
    GROUP BY P.IDCLIENT, P.OID
    HAVING COUNT(D.OID) = 0

    En commentaire, ce qu'il faut rajouter si ça ne marche pas tel quel.

    Ça évite de passer par un EXISTS.

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 463
    Par défaut
    On peut la simplifier:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT P.IDCLIENT, P.OID
    FROM PERSONNE P
    LEFT OUTER JOIN DENOMINATION D ON P.OID = D.OID AND D.DTINVALIDATION IS NULL
    WHERE P.IDCLIENT IN (liste d'idenfiants)
    and D.OID is null

    Tatayo.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Citation Envoyé par Bibeleuh Voir le message
    La clause NOT EXISTS devrait résoudre le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT P.IDCLIENT, P.OID FROM PERSONNE P
    WHERE NOT EXISTS
        (
            SELECT 1 FROM DENOMINATION D WHERE D.OID = P.OID
            AND D.DTINVALIDATION IS NULL
        )
    Merci beaucoup, ça fonctionne parfaitement !

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT P.IDCLIENT, P.OID /*, COUNT(D.OID) */
    FROM PERSONNE P
    LEFT OUTER JOIN DENOMINATION D ON P.OID = D.OID AND D.DTINVALIDATION IS NULL
    WHERE P.IDCLIENT IN (liste d'idenfiants)
    GROUP BY P.IDCLIENT, P.OID
    HAVING COUNT(D.OID) = 0

    En commentaire, ce qu'il faut rajouter si ça ne marche pas tel quel.

    Ça évite de passer par un EXISTS.
    Je l'ai essayée, cette requête ne me retourne rien...

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Citation Envoyé par tatayo Voir le message
    On peut la simplifier:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT P.IDCLIENT, P.OID
    FROM PERSONNE P
    LEFT OUTER JOIN DENOMINATION D ON P.OID = D.OID AND D.DTINVALIDATION IS NULL
    WHERE P.IDCLIENT IN (liste d'idenfiants)
    and D.OID is null

    Tatayo.
    Celle-ci, en revanche, fonctionne merveilleusement bien !

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Un grand merci à tatayo, StringBuilder, Bibeleuh !

    Mon problème est complètement résolu. A ma charge maintenant de prendre de la hauteur par rapport à SQL pour comprendre le LEFT OUTER .

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/07/2009, 10h06
  2. Réponses: 2
    Dernier message: 13/04/2007, 07h09
  3. [MySQL] Introduire une variable dans requête SQL, insérer des données à la volée
    Par Ronan.f dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 29/04/2006, 22h10
  4. [SQL2K] requête SQL, comparer des dates
    Par cortex024 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/03/2006, 14h32
  5. [VB.NET] [SQL] Pb requête sql, récupérer des params. ?
    Par Pleymo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/02/2005, 20h15

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