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 et SQL. Discussion :

Requête UNION qui n'aboutit pas


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 2
    Points
    2
    Par défaut Requête UNION qui n'aboutit pas
    Bonjour tout le monde,

    j'ai une requête UNION qui se lance sans message d'erreur mais elle est très longue et n'aboutit jamais, ci-dessous le code pour info
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT "MATISSE" as base,[Delta Compta_Primes].[Date Comptable de Production], [Delta Compta_Primes].[Code Produit], [Delta Compta_Primes].[Montant de lécriture en devise]
    FROM [Delta Compta_Primes] LEFT JOIN [Delta Omega_Primes] ON ([Delta Compta_Primes].[Code Produit] = [Delta Omega_Primes].[Code Produit]) AND ([Delta Compta_Primes].[Date Comptable de Production] = [Delta Omega_Primes].[Date comptable])
    WHERE ((([Delta Compta_Primes].[Montant de lécriture en devise])<>Nz([Delta Omega_Primes].[CA taxe belge incluse],0))) OR ((([Delta Omega_Primes].[CA taxe belge incluse]) Is Null))
    UNION SELECT "OMEGA",[Delta Omega_Primes].[Date comptable], [Delta Omega_Primes].[Code Produit], [Delta Omega_Primes].[CA taxe belge incluse]
    FROM [Delta Omega_Primes] LEFT JOIN [Delta Compta_Primes] ON ([Delta Omega_Primes].[Code Produit] = [Delta Compta_Primes].[Code Produit]) AND ([Delta Omega_Primes].[Date comptable] = [Delta Compta_Primes].[Date Comptable de Production])
    WHERE ((([Delta Omega_Primes].[CA taxe belge incluse])<>Nz([Delta Compta_Primes].[Montant de lécriture en devise],0))) OR ((([Delta Compta_Primes].[Montant de lécriture en devise]) Is Null));
    Ce code m'a été indiqué par un contributeur du forum, je ne maitrise absolument pas...

    quelqu'un peut-il me venir en aide ?

    Merci d'avance.

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 867
    Points
    56 867
    Billets dans le blog
    40
    Par défaut
    bonjour,

    la requête est donc syntaxiquement correcte mais tes tables sont peut-être volumineuses.

    Deux choses à tenter dans un premier temps:

    - tester les deux sous-requêtes SELECT séparément de part et d'autre du mot-clé UNION
    - essayer avec UNION ALL à la place de UNION

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    çà y est j'ai testé les select. J'ai copié la requête Union puis j'ai supprimé tout ce qui était après le UNION dans une 1ère requête puis supprimer tout ce qui est avant le UNION dans une seconde, il est vrai que la seconde requête est légèrement plus longue mais elle a aboutit en 30secondes quand même.

    Donc que me conseilles-tu ??

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    J'ai ajouté ALL derrière UNION et la requête a abouti. Je pense que çà fonctionne. Il faut que je vérifier avec les résultats obtenus avec le travail fait à la main auparavant.

    peux tu m'expliquer la différence entre le UNION seul et le UNION ALL ??

    merci

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 867
    Points
    56 867
    Billets dans le blog
    40
    Par défaut
    30 secondes c'est déjà pas mal, quel est le volume des deux tables [Delta Compta_Primes] et [Delta Omega_Primes] (en nombre d'enregistrements grosso modo) ?

    Tu as essayé ça ?
    Citation Envoyé par f-leb Voir le message
    - essayer avec UNION ALL à la place de UNION

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 867
    Points
    56 867
    Billets dans le blog
    40
    Par défaut
    téléscopage de posts !

    ok, UNION tout seul oblige à supprimer les doublons !

    S'il n'y a aucun risque de doublons tu peux mettre UNION ALL, comme ça il n'y aura pas de recherche inutile de doublons ce qui rend la requête plus rapide en principe.

    Par contre, même si UNION ALL est plus rapide, tu as peut être des enregistrements supplémentaires (des doublons) que tu n'aurais pas eu avec UNION seul. Il faudrait vérifier cela.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    En effet je vois sur le résultat de la requête que beaucoup de lignes se répètent. La table compta primes compte environ 13700 lignes et la oméga environ 535000. je ne sais pas si les doublons sont normaux ou pas. de plus il faut savoir qu'il s'agit de données pour un seul mois autant dire qu'en fin d'année çà va ramer !!!


    Citation Envoyé par f-leb Voir le message
    téléscopage de posts !

    ok, UNION tout seul oblige à supprimer les doublons !

    S'il n'y a aucun risque de doublons tu peux mettre UNION ALL, comme ça il n'y aura pas de recherche inutile de doublons.

    Par contre, même si UNION ALL est plus rapide, tu as peut être des enregistrements supplémentaires (des doublons) que tu n'aurais pas eu avec UNION seul. Il faudrait vérifier cela.

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 867
    Points
    56 867
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par karine62 Voir le message
    ... et la oméga environ 535000.
    ça commence à faire beaucoup pour le povr' Access, à multiplier x12, il va exploser !

    Il y a peut-être moyen d'optimiser la requête, en deux mots que sont censées ramener les deux sous-requêtes et le but de l'UNION ? (un lien vers la discussion correspondante peut-être ?).

    Voir aussi du côté de l'indexation des champs, il y a une clé primaire sur ces tables ?

    Sinon je crains qu'avec Access on soit obligé de bricoler en passant par des tables temporaires.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    j'ai mis du temps à retrouver la discussion sur le forum je ne suis pas une habituée mais voilà c'était çà le début

    http://www.developpez.net/forums/d12...s-differences/

    puis j'avais ajouter cela :

    Citation Envoyé par karine62
    avant de cloturer la discussion, j'aurai du te demander si dans la même requête on peut ajouter du code qui donne aussi une ligne présente dans une base mais pas dans l'autre ?
    Oui, c'est possible, mais il faudra faire le contrôle des 2 cotés : BASE A vers BASE B et BASE B vers BASE A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT "A" as base,[BASE A].Date, [BASE A].Produit, [BASE A].Montant
    FROM [BASE A] LEFT JOIN [BASE B] ON ([BASE A].Produit = [BASE B].Produit) AND ([BASE A].Date = [BASE B].Date)
    WHERE ((([BASE A].Montant)<>Nz([BASE B].[Montant],0))) OR ((([BASE B].Montant) Is Null))
    UNION
    SELECT "B",[BASE B].Date, [BASE B].Produit, [BASE B].Montant
    FROM [BASE B] LEFT JOIN [BASE A] ON ([BASE B].Produit = [BASE A].Produit) AND ([BASE B].Date = [BASE A].Date)
    WHERE ((([BASE B].Montant)<>Nz([BASE A].[Montant],0))) OR ((([BASE A].Montant) Is Null));

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 867
    Points
    56 867
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Citation Envoyé par karine62 Voir le message
    En effet je vois sur le résultat de la requête que beaucoup de lignes se répètent. La table compta primes compte environ 13700 lignes et la oméga environ 535000. je ne sais pas si les doublons sont normaux ou pas.
    Mmhh... qu'entends-tu par "doublon" ?

    Est-ce que dans chacune des deux tables tu peux avoir des doublons sur le couple ([code produit], [Date comptable]) ou ([Code produit], [Date comptable de production]) ? Parce que si non, je ne vois pas bien comment tu peux avoir des doublons à cause du champ [base]="MATISSE" ou "OMEGA"

    Il faudrait déjà s'assurer que la requête retourne le résultat que tu souhaites avec UNION ou UNION ALL (faire des essais sur des tables plus petites).

    Est-ce qu'il y a un/des index(s) sur les tables ? Clé primaire ? Index "Unique" ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Salut,

    je pense qu'il peut y avoir des doublons car il s'agit de montants versés sur un produit à une date donnée donc sur la masse, il se peut que deux clients aient versé le même montant sur un produit identique et à la même date !!

    Je n'ai pas de clé primaire ni d'index dans ces tables.

  12. #12
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 867
    Points
    56 867
    Billets dans le blog
    40
    Par défaut
    Donc tu peux avoir des lignes du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "MATISSE"   10/11/2012    Produit1    3000.00
    "MATISSE"   10/11/2012    Produit1    3000.00
    parce qu'il y a deux versements identiques pour le même produit à la même date.

    Si ce sont deux versements différents, je présume qu'il ne faut pas dédoublonner ces deux lignes ===> UNION ALL, et en prime c'est plus rapide.

    Par contre, dans tes deux tables tu peux tenter de mettre un index sur (codeproduit, date). Sans garantie, mais on ne sait jamais.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Non en effet, il faut que je puisse identifier quelle ligne exactement est en anomalie. De toute façon, il existe un numéro de contrat qui me permettra d'isoler ces lignes mais je ne peux pas m'en servir comme clé primaire car d'une part il se peut qu'il y ait des versements chaque mois sur un même contrat donc le numéro de contrat se retrouvera autant de fois dans la table et d'autre part ces versements sont parfois agrégés et c'est le 1er numéro de contrat qui est référencé pour l'ensemble des lignes agrégées, bref c'est une problématique interne à mon entreprise çà...

    Je vais tenté l'index, mais je trouve que le nombre de lignes répétées est toutefois très élevè. Il s'agit des données de janvier, il faut que je vérifie avec le rappro que j'avais réalisé à la main sur ces données pour comparer les résultats mais je n'ai pas le fichier avec moi ce week end.

    Dans tous les cas, je te remercie pour ton aide précieuse et tes explications précieuses. Je reviens peut être mercredi pour donner plus d'informations en cas de problème !!

    Merci et à bientôt peut être

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Bah voilà je viens de tester avec les 10 mois et c'est galère !! outre la durée il y a trop de données que je ne parviens pas à extraire sous excel, il faudrait que je puisse ajouter dans la requête un critère "mois comptable" (le champ existe bien sur dans la table !)

    merci

  15. #15
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 867
    Points
    56 867
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par karine62 Voir le message
    La table compta primes compte environ 13700 lignes et la oméga environ 535000 ... de plus il faut savoir qu'il s'agit de données pour un seul mois autant dire qu'en fin d'année çà va ramer !!!
    C'est sûr, sur 10 mois Access atteint ses limites

    il faudrait que je puisse ajouter dans la requête un critère "mois comptable" (le champ existe bien sur dans la table !)
    Eh bien rien n'empêche de faire une sous-requête qui filtre les dates, par exemple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM [Delta Compta_Primes] WHERE format([Date Comptable de Production], "mm/yyyy")= "11/2012"
    puis de faire l'UNION ensuite.

Discussions similaires

  1. Requête qui n'aboutit pas
    Par nova23 dans le forum Oracle
    Réponses: 9
    Dernier message: 07/05/2013, 11h54
  2. [IBatis] Requête qui n'aboutit pas
    Par jgfa9 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 17/08/2012, 01h06
  3. Requête qui n'aboutit pas
    Par lepotier dans le forum Requêtes
    Réponses: 24
    Dernier message: 05/02/2010, 12h12
  4. Réponses: 2
    Dernier message: 23/03/2007, 10h44
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04

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