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 :

Debutant SQL : "N'a jamais"


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Debutant SQL : "N'a jamais"
    Bonjour à tous,

    J'ai une requête qui au départ ne m'a pas parue bien méchante, mais qui au final me pose problème.

    J'ai une table de stockage de messages envoyés, avec les champs suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    idmsg, date_envoi , destinataire, code
    Un destinataire peut faire l'objet de plusieurs envoi par jour.

    La problématique est la suivant : je souhaite connaitre tous les destinataires qui n'ont JAMAIS eu de code = 0, sur une période donnée.

    Si je fais quelque chose qui ressemble a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select destinataire, COUNT(idmsg)
    WHERE date_envoi BETWEEN '2009' AND '2010'
    AND code > 0
    GROUP BY destinataire
    J'obtient le nombre de message ou il n'y a pas eu de code = 0. Mais rien ne me dit qu'il n'y en a jamais eu.

    Je suppose que la solution a mon problème est tout con ? Si vous pouvez m'aider ...

  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
    Utilisez NOT EXISTS avec une sous requête corrélée.
    Lisez ceci:
    http://sqlpro.developpez.com/cours/s...quetes/#L1.5.1

    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
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse rapide, qui m'a aiguillé !
    Finalement je m'en suit sorti avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT destinataire
    FROM matable
    WHERE destinataire NOT IN ( select code FROM matable WHERE code = 0 AND date BETWEEN 2009 AND 2010)
    AND date BETWEEN 2009 AND 2010
    Quelle est la difference avec le NOT EXISTS ?

    Ma table commence a être un peu grosse (10 000 000 de ligne) , pour l'instant je fais des essais en mettant une petite intervalle de date.
    Y'a t'il une optimisation de cette requête a faire si je veux faire ca sur toute la table sans coucher la machine ?

  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
    Il est généralement plus rapide car il s'arrête dès qu'une donnée validant la condition est trouvée....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT destinataire
    FROM   matable AS Tout
    WHERE  NOT EXISTS (SELECT code 
                       FROM   matable AS Tin
                       WHERE  code = 0 
                         AND  date BETWEEN 2009 AND 2010
                         AND  Tout.destinataire = Tin.destinataire)
    AND  date BETWEEN 2009 AND 2010
    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
    Et pourquoi pas un bête having ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT destinataire
    FROM   matable
    WHERE  date BETWEEN 2009 AND 2010
    GROUP BY DESTINATAIRE
    having sum(case code when 0 then 1 else 0 end) = 0
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. [Toutes versions] Requête SQL avec Simples et Doubles Quotes
    Par Roums dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/03/2010, 10h00
  2. Debutant SQL : Comment inserer une nouvelle colonne dans une
    Par cquadjul dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/07/2005, 21h34
  3. [debutant]sql serveur et not null?
    Par christophebmx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/11/2004, 16h21
  4. [Debutant][SQL] Execution de procedures stockées
    Par Yannos94 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 18h09

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