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 :

Problème avec une requête


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut Problème avec une requête
    Bonjour


    Voilà ma requête
    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
    SELECT     Taffaire.Code_Affaire, TSites.Code_Site, Taffaire.code_agence, GChangementEtatProjet.EtatPro, TSites.ddeb_chantier, TSites.dfin_chantier, Taffaire.chargedaffaire, 
                          Taffaire.IntituleAffaire, Taffaire.TypeConvention
    FROM         Taffaire LEFT OUTER JOIN
                          TSites ON Taffaire.Code_Affaire = TSites.Code_Affaire LEFT OUTER JOIN
                              (SELECT     Code_Affaire, Code_site, MAX(EtatProjet) AS EtatPro
                                FROM          GChangementEtatProjet AS GChangementEtatProjet_1
                                WHERE      (DateFinEtat IS NULL)
                                GROUP BY Code_Affaire, Code_site) AS GChangementEtatProjet ON TSites.Code_Affaire = GChangementEtatProjet.Code_Affaire AND 
                          TSites.Code_Site = GChangementEtatProjet.Code_site
    WHERE     (TSites.ddeb_chantier >=
                              (SELECT     DateDebChantierRef
                                FROM          entreprise)) AND (Taffaire.AnneeCvt >=
                              (SELECT     AnneeCVTRef
                                FROM          entreprise AS entreprise_1)) AND (GChangementEtatProjet.EtatPro = 'ENC') AND (Taffaire.Code_Affaire IN
                              (SELECT     Code_Affaire
                                FROM          GChangementEtatConvention
                                WHERE      (EtatConvention <> 'ANL') AND (EtatConvention <> 'RSL') AND (DateFinEtat IS NULL))) AND ((Taffaire.Code_Affaire + TSites.Code_Site) NOT IN
                              (SELECT     Code_Affaire + Code_Site AS Expr1
                                FROM          TuserSite  )) AND (Taffaire.TypeConvention = 'CPLQ' OR Taffaire.TypeConvention = 'CPLT' OR  Taffaire.TypeConvention = 'CTEX')
    avec laquelle je dois avoir des codes affaires qui ne sont pas dans la table Tusersite
    mais le problème qui se pose que le résultat est erroné et je n'arrive pas à détecter la cause

    en sortie j'ai des affaires qui existe dans ma table Tusersite


    Merci d'avance pour votre aide

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Votre requête est difficilement lisible avec cette indentation !!


    Quel est le type des colonnes Taffaire.Code_Affaire et TSites.Code_Site, et sont-elles nullables ?

    votre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (Taffaire.Code_Affaire + TSites.Code_Site) NOT IN
                              (SELECT     Code_Affaire + Code_Site AS Expr1 ...
    est douteux et vous devriez le remplacer par un NOT EXISTS ou une jointure externe avec recherche de NULL

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    Merci pour votre réponse ..j'ai essayé avec Not exists mais la requête ne s’exécute même pas


    Dans la Table Taffaire j'ai plusieurs affaires et chacune peut disposer de plusieurs sites ..la tâche de ma requête c'est de récupérer les affaires qui non pas de contrôleur..j'ai fait la concaténation entre Code affaire et Code Site pour avoir les données exactes car on peut tomber dans le cas d'une affaire qui a 3 sites dont l'un on ne lui a pas affecté un ingénieur contrôleur

    Code Site primary Key de TSite
    Code Affaire primary Key de TAffaire
    et Code Affaire+Code Site+Matricule salarié primary Key de TUserSite

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    Votre problème n'est pas compréhensible.

    Soit vous l'exposer clairement soit pas grand monde pourra vous aider, en dehors des problèmes de syntaxe SQL :
    - présentez les tables
    - un jeu de donnée succinct mais qui couvre tous les cas, en entrée
    - présentez les regles de gestion
    - le résultat souhaité

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    J'ai essayé de remettre un peu en forme ta requête.
    Ça donnerait quelque chose comme ça :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    SELECT  aff.Code_Affaire                  
        ,   sit.Code_Site
        ,   aff.code_agence
        ,   cep.EtatPro
        ,   sit.ddeb_chantier
        ,   sit.dfin_chantier
        ,   aff.chargedaffaire
        ,   aff.IntituleAffaire    
        ,   aff.TypeConvention
    FROM    Taffaire    AS aff
        LEFT OUTER JOIN
            TSites      AS sit 
            ON  aff.Code_Affaire = sit.Code_Affaire 
            AND sit.ddeb_chantier >=  
                    (   SELECT  DateDebChantierRef
                        FROM    entreprise
                    )
        LEFT OUTER JOIN
            (   SELECT  gep.Code_Affaire
                    ,   gep.Code_site       
                    ,   MAX(gep.EtatProjet)     AS EtatPro
                FROM    GChangementEtatProjet   AS gep
                WHERE   gep.DateFinEtat IS NULL
                GROUP BY gep.Code_Affaire 
                    ,   gep.Code_site
            )   AS  cep 
            ON  sit.Code_Affaire = cep.Code_Affaire 
            AND sit.Code_Site    = cep.Code_site
    WHERE   cep.EtatPro = 'ENC' 
        AND aff.TypeConvention  IN ('CPLQ', 'CPLT', 'CTEX')
        AND aff.AnneeCvt >=
                (   SELECT  AnneeCVTRef
                    FROM    entreprise
                )
        AND EXISTS 
            (   SELECT  NULL
                FROM    GChangementEtatConvention   AS gec
                WHERE   gec.EtatConvention  NOT IN ('ANL', 'RSL') 
                    AND gec.DateFinEtat     IS NULL 
                    AND gec.Code_Affaire    = aff.Code_Affaire
            )
        AND NOT EXISTS
            (   SELECT  NULL
                FROM    TuserSite   AS usi
                WHERE   usi.Code_Affaire    = aff.Code_Affaire
                    AND usi.Code_Site       = sit.Code_Site
            )
    ;
    Il y a une question que je me pose : il n'y a qu'une ligne dans la table entreprise ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Il y a une question que je me pose : il n'y a qu'une ligne dans la table entreprise ?
    Je me posais la même question !

    Mais aussi, vous quelles sont les différentes valeurs pour la colonne EtatProjet ? vous prenez le max, je pense pour obtenir le dernier état du projet, c'est à dire l'état actuel. Mais tel que vous le faites, MAX ne vous renverra pas le dernier état, mais l'état dont le libellé est classé en dernier... dans l'ordre alphabétique du libellé...

    Pour votre test avec le NOT EXISTS, quelle requête (correctement indentée ) avez-vous écrite, et... quel est le message d'erreur ?

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    Merci pour la réponse
    pas une ligne
    c'est juste une donnée saisie par l'administration pour limiter la date car les anciennes affaires ne les intéressent plus

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par HDR_16 Voir le message
    j'ai fait la concaténation entre Code affaire et Code Site pour avoir les données exactes car on peut tomber dans le cas d'une affaire qui a 3 sites dont l'un on ne lui a pas affecté un ingénieur contrôleur
    En faisant ainsi, l'affaire "XY" avec le site "Z" va matcher avec l'affaire "X" site "YZ" !!!

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    J'ai décortiquer ma requête en l'exécutant partie par partie
    le problème se pose dans la parie de récupération des données qui ne sont pas dans TuserSite ..
    Elle me récupère des affaires qui existent dans la Table Tusersite...j'ai essayé votre requête de not exists ça marche mais ça ne donne pas le bon résultat

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Il faut maintenant identifier pourquoi ces lignes sont prises en compte : qu'ont-elles de particulier ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    La table TUsersite est identifié par les trois champs qui représente
    The primary key
    Code_Affaire+Code_Site+MatriculeSal
    c'est pour cela je cherchais auparavant Code_affaire+Code_Site qui ne sont pas dans cette table


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT  [Code_Affaire]
          ,[Code_Site]
          ,[MatriculeSal]
          ,[DateDebutSal]
          ,[DateFinSal]
          ,[ControlePlan]
          ,[ControleTrvExe]
          ,[ControleEqu]
          ,[CtrlSol]
          ,[CtrlMateriaux]
          ,[EtatSal]
          ,[NomPrenom]
      FROM [TuserSite]

    Voulà les champs de TUserSite

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    vous ne nous avez toujours pas dit si ces colonnes sont nullables !

    Attention au résultat avec des IN + NULL, les requêtes sous la forme WHERE ... [NOT] IN (...,NULL,...)...

    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
     
     
    SELECT 
     
    	CASE 
    		WHEN 2 NOT IN (1,3,4,5) 
    			THEN '2 n''est pas dans la liste ! '
    		ELSE '2 est dans la liste ! '
    	END AS SansNULL
    ,
    	CASE 
    		WHEN 2 NOT IN (1,3,4,5,NULL) 
    			THEN '2 n''est pas dans la liste ! '
    		ELSE '2 est dans la liste ! '
    	END AS AvecNULL
    renvoit...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SansNULL                     AvecNULL
    ---------------------------- ----------------------
    2 n'est pas dans la liste !  2 est dans la liste !

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2013
    Messages
    43
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 43
    Points : 20
    Points
    20
    Par défaut
    Non les valeurs Code_Site et Code_affaire ne sont jamais à Null

Discussions similaires

  1. [TADOQuery] Problème avec une requête
    Par yannba dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/01/2006, 13h51
  2. Problème avec une requête
    Par demonark dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/09/2005, 05h35
  3. Problème avec une requête
    Par ringostarr dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/04/2005, 20h34
  4. Problème avec une requête
    Par snoopy69 dans le forum Débuter
    Réponses: 2
    Dernier message: 20/01/2005, 12h39
  5. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29

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