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 :

[SQL SERVER 2000] Probleme avec "NOT IN"


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut [SQL SERVER 2000] Probleme avec "NOT IN"
    Bonjour,

    j'ai un problem bizarre avec une requete SQL, la voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT COUNT(*) 
    FROM Teilnehmer
    WHERE (aktiv = 1) AND (Punktestand > 7000) AND (Punktestand <= 9000) 
    AND 
    (KVNR not  IN 
    (SELECT DISTINCT KVNR FROM praemien WHERE akzeptiert = 1 AND kz_storno = 0 and jahr=2006
    union SELECT DISTINCT KVNR FROM Punkte WHERE akzeptiert = 1 AND kz_storno = 0 and jahr=2006))
    le problem c'est que la meme requete me renvoyait le bon resultat quand je l'ai créée... puis d'un coup ca me revois plus rien... et ca vient de l'instruction: NOT IN

    la seule chose qu'a changé, c'est que j'ai mis a jour le service pack de mon serveur
    je crois pas que ca doit etre le problem, mais si quelqu'un a une idée ca me serait tres utile!

    Merci de votre aide!

    PS: quand j'essaye de diviser la requete en 2 sous-requetes comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(*) from query1 where KVNR not in (select kvnr from query2)
    ca fonctionne... n'est ce pas bizarre?

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    A priori il n'y a pas de raison, est-ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT KVNR FROM praemien WHERE akzeptiert = 1 AND kz_storno = 0 AND jahr=2006
    union SELECT KVNR FROM Punkte WHERE akzeptiert = 1 AND kz_storno = 0 AND jahr=2006
    te renvoie qqch ?

    le DISTINCT est inutile si tu fais un UNION : UNION élimine les doublons.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut
    Salut rudib, et merci pour ta reponse.

    Oui le:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT KVNR FROM praemien 
    WHERE akzeptiert = 1 AND kz_storno = 0 AND jahr=2006 
    union SELECT KVNR FROM Punkte 
    WHERE akzeptiert = 1 AND kz_storno = 0 AND jahr=2006
    me renvoir une liste de plusieurs milliers de KVNR (genre code client).

    tu as raison, le distinct est inutil... je l'avais mis de peur d'avoir des doublons avant de faire l'union :s

    ce problem commence serieusement a m'enerver... surtout que la meme chose fonctionnait avant... et j'utiliser ce genre de requete dans beaucoup de cas... ca me pose un problem si je dois changer toutes mes requetes, car toute ne fonctionne plus

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Très bizarre.
    Et ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT COUNT(*) 
    FROM dbo.Teilnehmer t
    LEFT JOIN (SELECT KVNR FROM dbo.praemien WHERE akzeptiert = 1 AND kz_storno = 0 AND jahr=2006
    union SELECT KVNR FROM dbo.Punkte WHERE akzeptiert = 1 AND kz_storno = 0 AND jahr=2006) p ON p.KVNR = t.KVNR 
    WHERE (aktiv = 1) AND (Punktestand > 7000) AND (Punktestand <= 9000) 
    AND p.KVNR IS NULL
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut
    merci encore Rudi pour ton aide.

    le code que tu as ecris renvoie bien un resultat, mais ce n'est pas le resultat souhaité...

    le but de la requete est de :
    - renvoyer le nomre de clients inactif (NOT in...)
    -et quand je veux avoir le nombre de client actif je j'enleve le NOT et c'est tout...

    avec le requete que tu m'as donné ca renvoie le meme resultat de ma requete sans la condition .... KVNR not IN (Select...)

    j'ai aussi essayé avec ta requete, full join, ou inner join, et ca renvoie le resultat equivalent a ma requete avec ... KVNR IN (select...)

  6. #6
    Rédacteur

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

    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
    SELECT COUNT(*) AS N
    FROM   Teilnehmer
    WHERE  aktiv = 1 
      AND  Punktestand > 7000 
      AND  Punktestand <= 9000
      AND  KVNR NOT IN (SELECT KVNR 
                        FROM   praemien 
                        WHERE  akzeptiert = 1 
                          AND  kz_storno = 0 
                          AND  jahr = 2006
                        UNION
                        SELECT KVNR 
                        FROM   Punkte 
                        WHERE  akzeptiert = 1 
                          AND  kz_storno = 0 
                          AND  jahr = 2006)
    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/ * * * * *

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut
    Bonjour, et merci encore pour votre aide.

    j'ai essayé ce code, mais ca me retourne toujours 0

    quand je fait cette requete par etape, comme ca:


    req1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT KVNR
    FROM   Teilnehmer
    WHERE  aktiv = 1 
      AND  Punktestand > 7000 
      AND  Punktestand <= 9000
    req2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select kvnr from req1 where
    KVNR IN
    (SELECT KVNR FROM   praemien 
    WHERE  akzeptiert = 1 AND  kz_storno = 0 AND  jahr = 2006
    UNION
    SELECT KVNR FROM   Punkte 
    WHERE  akzeptiert = 1 AND  kz_storno = 0 AND  jahr = 2006)
    puis

    req3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(*) from req1 where kvnr not in (select kvnr from req2)
    ca fonctionne... bizarre non

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Points : 94
    Points
    94
    Par défaut
    Salut,

    dans un autre sujet sur ce forum, le membre phili_b avait proposé une solution en utilisant NOT EXISTS.

    dans mon cas ca donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT COUNT(*) FROM Teilnehmer T
    WHERE aktiv = 1 AND Punktestand > 7000 AND Punktestand <= 9000  
    AND  NOT EXISTS 
    (SELECT 'x' FROM praemien pr
    WHERE akzeptiert = 1 AND kz_storno = 0 AND jahr = 2006  
    AND pr.kvnr = T.kvnr
    UNION 
    SELECT 'x' FROM Punkte pk
    WHERE akzeptiert = 1 AND kz_storno = 0 AND jahr = 2006
    and pk.kvnr = T.kvnr)
    et ca fonctionne. donc cela me permet d'obtenir les KVNR qui sont dans liste1 et pas dans liste2... et ce dans une seule requete!

    voila donc probleme resolu, mais je comprends toujours pas pourquoi la premiere requete avec "NOT IN" ne fonctionne plus, alors qu'elle fonctionnait avant

    peut etre quelqu'un a eu le meme probleme un jour ?

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

Discussions similaires

  1. SQL Server 2000 Probleme
    Par imados dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/04/2007, 14h40
  2. [SQL Server 2000] requête avec le nom de la table dynamique
    Par insane_80 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2006, 17h57
  3. [SQL Server 2000]Probleme avec les dates !
    Par ChristopheOce dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/10/2006, 15h58
  4. sql server 2000 installation avec amd 64
    Par rouchederoche dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/10/2006, 09h39
  5. Réponses: 2
    Dernier message: 27/07/2006, 14h41

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