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

Requêtes MySQL Discussion :

WHERE AND NOT


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Points : 7
    Points
    7
    Par défaut WHERE AND NOT
    Bonjour,
    Je n'arrive pas à comprendre pourquoi ma requête ne fonctionne pas, et pourtant je l'ai retourner dans tous les sens.
    J'ai changé l'ordre des requêtes et les parenthèses en vain ...
    Je souhaite récupérer les clients qui ont eu une intervention de coupure mais pas une intervention de mise en service. Les deux interventions doivent avoir le statut terminé et avoir une date sup au 1er Mai.

    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 distinct A.REFERENCE as EDL, B.STATUT as contrat_statut, D.TYPEAFFAIRE, D.SOUSTYPE, D.STATUT as affaire_statut, D.DATEMODIFICATION
     
    from TESPACEDELIVRAISON A
    inner join TCONTRAT_ESPACESDELIVRAISON C on C.DEST=A.ID
    inner join VRP_CONTRAT B on B.ID=C.SOURCE
    inner join VRP_AFFAIRE D on D.ADRESSE_ID=A.ID
     
    where  B.STATUT in (1,2,3) /* statut actif, en cours de modif, en cours de cessation */
    and D.TYPEAFFAIRE = 3 /* inter tech */
     
    and (
         D.SOUSTYPE = 'CPRNPAY' /* coupure pour non paiement */
         and D.STATUT = 1 /* statut affaire terminé */
         and D.DATEMODIFICATION >=TO_DATE(TO_DATE('01/05/2021 00:00','dd/mm/yyyy hh24:mi'))
        )
    and not D.SOUSTYPE = 'COUPURE' /* m en serv après coupure*/

  2. #2
    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 786
    Points
    30 786
    Par défaut
    Bonjour,

    Si tu souhaites consulter les caractéristiques de deux interventions (coupure et mise en service), il faut accéder deux fois à la table qui les décrit donc deux jointures sur cette même table avec des alias différents.

    Si j'ai bien compris, il s'agit d'identifier les interventions de coupure pour lesquelles il n'existe pas d'intervention de mise en service pour le même contrat.

    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
    select  distinct 
            EDL.REFERENCE     as EDL
        ,   VRP.STATUT        as contrat_statut
        ,   AFF.TYPEAFFAIRE
        ,   AFF.SOUSTYPE
        ,   AFF.STATUT        as affaire_statut
        ,   AFF.DATEMODIFICATION
    from    TESPACEDELIVRAISON          EDL
        inner join 
            TCONTRAT_ESPACESDELIVRAISON CNT 
            on  CNT.DEST    = EDL.ID
        inner join 
            VRP_CONTRAT                 VRP 
            on  VRP.ID      = CNT.SOURCE
        inner join 
            VRP_AFFAIRE                 AFF 
            on  AFF.ADRESSE_ID  = EDL.ID
    where   VRP.STATUT in (1, 2, 3)   /* statut actif, en cours de modif, en cours de cessation */
        and AFF.TYPEAFFAIRE   = 3     /* inter tech */
        and AFF.SOUSTYPE  = 'CPRNPAY' /* coupure pour non paiement */
        and AFF.STATUT    = 1         /* statut affaire terminé */
        and AFF.DATEMODIFICATION >= TO_DATE('01/05/2021 00:00','dd/mm/yyyy hh24:mi')
        and not exists
            (   select  1
                from    VRP_AFFAIRE     MES
                where   MES.ADRESSE_ID  = EDL.ID
                    and MES.TYPEAFFAIRE = 3     /* inter tech */
                    and MES.DATEMODIFICATION >= TO_DATE('01/05/2021 00:00','dd/mm/yyyy hh24:mi')
                    and MES.SOUSTYPE = 'COUPURE'  /* m en serv après coupure*/
            )
    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.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Le comportement est normal ici, pour résumer ta requête fait ce test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    D.SOUSTYPE = 'CPRNPAY' and D.SOUSTYPE <> 'COUPURE'
    Pour ce que tu veux faire, il faut passer par un NOT EXIST, LEFT OUTER JOIN...
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select c.*
    from client c
    inner join intervention i1 on i1.idclient = c.id
    left outer join intervention i2 on i2.client = c.id and i2.type = 'T2'
    where i1.type = 'T1' and i2.idclient is null
    Tatayo.

    P.S. bizarre comme formulation : AND NOT xx='yy'. J'ai plutôt tendance à utiliser xx <> 'yy'.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Bonjour,

    Si tu souhaites consulter les caractéristiques de deux interventions (coupure et mise en service), il faut accéder deux fois à la table qui les décrit donc deux jointures sur cette même table avec des alias différents.

    Si j'ai bien compris, il s'agit d'identifier les interventions de coupure pour lesquelles il n'existe pas d'intervention de mise en service pour le même contrat.

    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
    select  distinct 
            EDL.REFERENCE     as EDL
        ,   VRP.STATUT        as contrat_statut
        ,   AFF.TYPEAFFAIRE
        ,   AFF.SOUSTYPE
        ,   AFF.STATUT        as affaire_statut
        ,   AFF.DATEMODIFICATION
    from    TESPACEDELIVRAISON          EDL
        inner join 
            TCONTRAT_ESPACESDELIVRAISON CNT 
            on  CNT.DEST    = EDL.ID
        inner join 
            VRP_CONTRAT                 VRP 
            on  VRP.ID      = CNT.SOURCE
        inner join 
            VRP_AFFAIRE                 AFF 
            on  AFF.ADRESSE_ID  = EDL.ID
    where   VRP.STATUT in (1, 2, 3)   /* statut actif, en cours de modif, en cours de cessation */
        and AFF.TYPEAFFAIRE   = 3     /* inter tech */
        and AFF.SOUSTYPE  = 'CPRNPAY' /* coupure pour non paiement */
        and AFF.STATUT    = 1         /* statut affaire terminé */
        and AFF.DATEMODIFICATION >= TO_DATE('01/05/2021 00:00','dd/mm/yyyy hh24:mi')
        and not exists
            (   select  1
                from    VRP_AFFAIRE     MES
                where   MES.ADRESSE_ID  = EDL.ID
                    and MES.TYPEAFFAIRE = 3     /* inter tech */
                    and MES.DATEMODIFICATION >= TO_DATE('01/05/2021 00:00','dd/mm/yyyy hh24:mi')
                    and MES.SOUSTYPE = 'COUPURE'  /* m en serv après coupure*/
            )
    Merci !!!! c'est exactement cela.
    En faisant mes recherches, je suis tombée sur le "not exists" mais pour moi comme il y avait forcément des cas, je me suis dit que ce n'était pas ce qu'il me fallait

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

Discussions similaires

  1. TableViewer - Custom cell (and not StyledText)
    Par Aurelien Pupier dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 20/05/2009, 18h23
  2. Delete avec where .. and ..
    Par petitcatenaire dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/12/2008, 11h51
  3. requete SQL enchainant des "WHERE" / "AND"
    Par Loki83 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/10/2008, 14h26
  4. LIST and not LINKED list
    Par bobkorn dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 20/05/2008, 19h00
  5. requete avec and not
    Par krfa1 dans le forum Requêtes
    Réponses: 1
    Dernier message: 19/09/2006, 16h39

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