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 UNION et WHERE


Sujet :

Langage SQL

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut Problème avec UNION et WHERE
    Bonjour à tous,
    Mon problème est que ma requete SQL me renvoie seulement le résultat d'une table. Hors, il devrait m'en revoyer de plusieurs tables .

    Voici le code :
    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 N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB, 
    IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0, MVT_MNT  ,Null)As CREDIT,  
    IIF(IN (SELECTFROM D_MODMVT),1,0)As STATE 
    FROM D_MVT WHERE (D_MVT.N° = :ecr1 ) 
     
    UNION ALL 
    SELECT N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB, 
    IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0, MVT_MNT  ,Null)As CREDIT, 2 As STATE 
    FROM D_MODMVT WHERE (D_MODMVT.N° = :ecr2 ) 
     
    UNION ALL
     SELECT N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB, 
    IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0, MVT_MNT  ,Null)As CREDIT, 3 As STATE 
    FROM D_SUPMVT WHERE (D_SUPMVT.N° = :ecr3 ) 
    ORDER BY 1 ;
    Et pourtant, je déclare bien UNION ALL.

    Ps : Si j'enleve les clause WHERE, il me renvoi un résultat de toutes les tables.

    Où est mon problème ?

    Merci d'avance.

  2. #2
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut

    tu as essayé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ....
    FROM D_MVT d INNER JOIN D_MODMVT dm ON d.N°=dm.N°
                 INNER JOIN D_SUPMVT ds ON d.N°=ds.N°
    WHERE d.N° = :ecr1 AND dm.N° = :ecr2 AND ds.N° = :ecr3
    ORDER BY N°;
    On utilise pas de chiffre dans le ORDER BY et les jointures sont bien mieux que l'UNION

    PS : c'est quoi :ecr1, :ecr2, :ecr3 (c'est pas des chaines de caractères, c'est pas des entiers, ...c'est bizarre comme truc).

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par trotters213
    On utilise pas de chiffre dans le ORDER BY
    Si, si

    Citation Envoyé par trotters213
    SELECT ....
    FROM D_MVT d INNER JOIN D_MODMVT dm ON d.N°=dm.N°
    INNER JOIN D_SUPMVT ds ON d.N°=ds.N°
    WHERE d.N° = :ecr1 AND dm.N° = :ecr2 AND ds.N° = :ecr3
    ORDER BY N°;
    Ce n'est pas ce qui est demandé, d'ailleurs pour que ta requête fonctionne il faudrait que ecr1 = ecr2 = ecr3.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par trotters213

    tu as essayé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ....
    FROM D_MVT d INNER JOIN D_MODMVT dm ON d.N°=dm.N°
                 INNER JOIN D_SUPMVT ds ON d.N°=ds.N°
    WHERE d.N° = :ecr1 AND dm.N° = :ecr2 AND ds.N° = :ecr3
    ORDER BY N°;
    On utilise pas de chiffre dans le ORDER BY et les jointures sont bien mieux que l'UNION

    PS : c'est quoi :ecr1, :ecr2, :ecr3 (c'est pas des chaines de caractères, c'est pas des entiers, ...c'est bizarre comme truc).
    Rien a voir avec une jointure.
    Je veux récupérer tout les records des trois tables en fonction des conditions.

    Pour ce qui est de :ecr1, :ecr2, :ecr3. Je les utilise comme paramètres puisque je ne connais que leur valeur lors de l'execution d'un programme.

    Merci

  5. #5
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    Oui on peut l'utiliser (on peut tout utiliser ) mais c'est déprécié, il vaut mieux mettre le nom de la colonne plutôt que le chiffre y faisant référence (ne serait-ce que pour de future mise à jour des requêtes).
    pour le 2° truc je vois pas pourquoi "il faudrait que ecr1 = ecr2 = ecr3"

    PS : j'ai appris avec les cours de SQLPro donc je ressort ce que j'ai compris

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par trotters213
    Oui on peut l'utiliser (on peut tout utiliser ) mais c'est déprécié, il vaut mieux mettre le nom de la colonne plutôt que le chiffre y faisant référence (ne serait-ce que pour de future mise à jour des requêtes).
    Ca dépend, dans un UNION, il est préférable, si pas obligatoire de mettre le numéro de la colonne.
    pour le 2° truc je vois pas pourquoi "il faudrait que ecr1 = ecr2 = ecr3"
    En effet , ecr1 pourrait très bien être différent de ecr2 et ecr3. Mais dans mon cas, ils sont bien égaux. Puisqu'on ne peut pas déclarer deux mêmes noms de paramètres dans un code SQL à partir d'un programme perso

    PS : j'ai appris avec les cours de SQLPro donc je ressort ce que j'ai appris

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par trotters213
    pour le 2° truc je vois pas pourquoi "il faudrait que ecr1 = ecr2 = ecr3"
    Dans ta requête on trouve :
    d.N°=dm.N°
    d.N°=ds.N°
    d.N° = :ecr1
    dm.N° = :ecr2
    ds.N° = :ecr3
    Donc il faut que ecr1 = ecr2 = ecr3, non ?
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    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
     
     
    SELECT N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB, 
    IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0, MVT_MNT  ,Null)As CREDIT,  
    IIF(IN (SELECTFROM D_MODMVT),1,0)As STATE 
    FROM D_MVT WHERE (D_MVT.N° = :ecr1 ) 
     
    UNION ALL 
    SELECT N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB, 
    IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0, MVT_MNT  ,Null)As CREDIT, 2 As STATE 
    FROM D_MODMVT WHERE (D_MODMVT.N° = :ecr2 ) 
     
    UNION ALL 
     SELECT N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB, 
    IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0, MVT_MNT  ,Null)As CREDIT, 3 As STATE 
    FROM D_SUPMVT WHERE (D_SUPMVT.N° = :ecr3 ) 
    ORDER BY 1 ;
    Exemple :
    Ecr1 = 14020
    Ecr2 = 14020
    Ecr3 = 14020

    Donc, il devrait en toute logique me sortir tout les records ayant N° = 14020.
    Donc D_MVT.N° = 14020 + D_MODMVT.N° = 14020 + D_SUPMVT.N° = 14020.
    Mais , le résultat me donne qu'un seul record présent dans la première table.

  9. #9
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    J'ai encore vraiment beaucoup à apprendre (je ne suis qu'un jeune étudiant donc soyez indulgent )
    Sinon en faisant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      (SELECT N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB,
       IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0,   MVT_MNT  ,Null)As CREDIT, 
       IIF(IN (SELECTFROM D_MODMVT),1,0)As STATE
       FROM D_MVT WHERE (D_MVT.N° = :ecr1 ))
    UNION
      (SELECT N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB,
       IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0, MVT_MNT  ,Null)As CREDIT, 2 As STATE
       FROM D_MODMVT WHERE (D_MODMVT.N° = :ecr2 ))
    UNION
      (SELECT N°, MVT_DATE, MVT_JNL, MVT_GEN, MVT_PAR, MVT_ACT, RTRIM(MVT_LIB)As MLIB,
       IIf(MVT_MNT <0, Abs(MVT_MNT)  ,Null) As DEBIT, IIf(MVT_MNT > 0, MVT_MNT  ,Null)As CREDIT, 3 As STATE
       FROM D_SUPMVT WHERE (D_SUPMVT.N° = :ecr3 ))
    ORDER BY 1

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    non, toujours la même chose

  11. #11
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    tu es sur que tu as des enregistrements pour la ligne que tu demandes :

  12. #12
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par trotters213
    tu es sur que tu as des enregistrements pour la ligne que tu demandes :
    Bonne question !
    Portu que donnes les 3 SELECTs de ton union exécutés séparément ?
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  13. #13
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Premier SELECT D_MVT : 1 RECORD
    Deuxième SELECT D_MODMVT : 10 RECORDS
    Troisième SELECT D_SUPMVT : 0 RECORD

    Mais je pense avoir trouvé d'où venait mon problème.
    Je regarde et je vous tiens au courant.

    Merci beaucoup

  14. #14
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Voila, j'ai trouvé mon problème qui se trouvait au niveau des paramètres.
    Comme je l'avais dit plus haut, on ne peut avoir plusieurs fois le même nom de paramètre dans une requête et en fait j'avais 3 fois :ecr dans ma requête.

    Problème résolu et mille excuses et mille merci.

    A+

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

Discussions similaires

  1. Problème avec UNION
    Par Dark Ryus dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/07/2010, 15h12
  2. Problème avec Union (et Blob)
    Par ejaecker dans le forum InterBase
    Réponses: 5
    Dernier message: 02/09/2008, 16h51
  3. problème avec UNION SQL
    Par greg1517 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 06/05/2007, 19h46
  4. Problème avec UNION et Group by
    Par dujardin dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/02/2007, 04h55
  5. [Debutant/MySQL] Problème avec AS et Where
    Par kei-kun41 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/01/2007, 12h44

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