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 :

Gestion doublon requête : Distinct et champ Mémo


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut Gestion doublon requête : Distinct et champ Mémo
    Bonjour,

    je travaille sur Access 97 lié via connexion ODBC à une vielle base Oracle version 7

    je travaille à l'extraction à plat de données et
    je galère un peu sur une requête car je souhaite supprimer des doublons dans une requête contenant des champs mémo
    j'ai une erreur d'Access qui ne peut inclure des champs mémo avec un Distinct

    j'ai essayé un DISTINCTROW mais cela ne me supprime pas mes doublons et pour ce que j'ai compris de la différence entre DISTINCT et DISTINCTROW c'est bien DISTINCT qu'il faut que j'utilise

    Par ailleurs, ma requête est super lente (n=412032 enregistrements retournés avec doublons, 228340 sans doublons)

    comment puis-je résoudre mon problème de doublons et éventuellement optimiser ma requête pour améliorer les performances ?

    d'avance merci pour aide

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT DISTINCT EFFORT_TABNUMERO_DOSSIER.ND_N_IDPATIENT, EFFORT_TABNUMERO_DOSSIER.ND_T_NUM_DOSSIER, EFFORT_TABNUMERO_DOSSIER.ND_T_NOM, EFFORT_TABNUMERO_DOSSIER.ND_T_PRENOM, T_SEXE.SEX_LIB AS ND_N_SEXE, EFFORT_TABNUMERO_DOSSIER.ND_D_DATE_NAISS, EFFORT_TABNUMERO_DOSSIER.ND_T_IPUM, EFFORT_TABEFFORT_VENUE.EFFORT_ID, EFFORT_TABEFFORT_VENUE.E_N_IDVENUE, EFFORT_TABEFFORT_VENUE.E_D_DATE_EPREUVE, EFFORT_TABEFFORT_VENUE.E_N_NUM_EPREUVE, EFFORT_TABPREALABLE_EFFORT.PE_N_HEURE, EFFORT_TABMEDECINS.T_LIBELLE AS PE_N_DEMANDEUR, EFFORT_TABHOSPITALISATION.T_LIBELLE AS PE_N_HOSPI, EFFORT_TABPRATICIENS_HOSPI.T_LIBELLE AS PE_N_PRAT_HOSPITALIER, EFFORT_TABPRATICIENS_ATTAC.T_LIBELLE AS PE_N_PRAT_ATTACHE, EFFORT_TABPREALABLE_EFFORT.PE_M_HIST_MALADIE, EFFORT_TABPREALABLE_EFFORT.PE_M_TRAITEMENT_JOUR, indications(EFFORT_TABPREALABLE_EFFORT.EFFORT_ID) AS IE_N_INDICATIONS, EFFORT_TABINDICATION_EFFORT.IE_T_AUTRES_INDICATIONS, EFFORT_TABPREALABLE_EFFORT.PE_N_AGE, EFFORT_TABPREALABLE_EFFORT.PE_N_POIDS, EFFORT_TABPREALABLE_EFFORT.PE_N_TAILLE, EFFORT_TABINFIRMIERES.T_LIBELLE AS PE_N_INFIRMIERE, EFFORT_TABTYPE_PROTOC.T_LIBELLE AS PE_N_PROTOCOLE, EFFORT_TABEFFORT_SALLES.T_LIBELLE AS PE_N_SALLE, EFFORT_TABPREALABLE_EFFORT.PE_B_TNT, EFFORT_TABPREALABLE_EFFORT.PE_B_THALLIUM, EFFORT_TABPREALABLE_EFFORT.PE_B_VO2, EFFORT_TABPREALABLE_EFFORT.PE_N_FREQ_REPOS, EFFORT_TABPREALABLE_EFFORT.PE_N_TAS_REPOS, EFFORT_TABPREALABLE_EFFORT.PE_N_TAD_REPOS, EFFORT_TABPREALABLE_EFFORT.PE_M_COMMENT_REPOS, EFFORT_TABEPREUVES_ABRUP.T_MINUTE_PALIER AS PE_N_EPREUVES, EFFORT_TABPREALABLE_EFFORT.PE_N_PALIER_DEBUT
    FROM ((((((((((((EFFORT_TABNUMERO_DOSSIER LEFT JOIN EFFORT_TABEFFORT_VENUE ON EFFORT_TABNUMERO_DOSSIER.ND_N_IDPATIENT = EFFORT_TABEFFORT_VENUE.E_N_IDPATIENT) LEFT JOIN T_SEXE ON EFFORT_TABNUMERO_DOSSIER.ND_N_SEXE = T_SEXE.SEX_NUM) LEFT JOIN EFFORT_TABPREALABLE_EFFORT ON EFFORT_TABEFFORT_VENUE.EFFORT_ID = EFFORT_TABPREALABLE_EFFORT.EFFORT_ID) LEFT JOIN EFFORT_TABMEDECINS ON EFFORT_TABPREALABLE_EFFORT.PE_N_DEMANDEUR = EFFORT_TABMEDECINS.N_CODE) LEFT JOIN EFFORT_TABHOSPITALISATION ON EFFORT_TABPREALABLE_EFFORT.PE_N_HOSPI = EFFORT_TABHOSPITALISATION.N_CODE) LEFT JOIN EFFORT_TABPRATICIENS_HOSPI ON EFFORT_TABPREALABLE_EFFORT.PE_N_PRAT_HOSPITALIER = EFFORT_TABPRATICIENS_HOSPI.N_CODE) LEFT JOIN EFFORT_TABPRATICIENS_ATTAC ON EFFORT_TABPREALABLE_EFFORT.PE_N_PRAT_ATTACHE = EFFORT_TABPRATICIENS_ATTAC.N_CODE) LEFT JOIN EFFORT_TABEFFORT_SALLES ON EFFORT_TABPREALABLE_EFFORT.PE_N_SALLE = EFFORT_TABEFFORT_SALLES.N_CODE) LEFT JOIN EFFORT_TABINFIRMIERES ON EFFORT_TABPREALABLE_EFFORT.PE_N_INFIRMIERE = EFFORT_TABINFIRMIERES.N_CODE) LEFT JOIN EFFORT_TABTYPE_PROTOC ON EFFORT_TABPREALABLE_EFFORT.PE_N_PROTOCOLE = EFFORT_TABTYPE_PROTOC.N_CODE) LEFT JOIN EFFORT_TABEPREUVES_ABRUP ON EFFORT_TABPREALABLE_EFFORT.PE_N_EPREUVES_ABRUTE = EFFORT_TABEPREUVES_ABRUP.N_CODE) LEFT JOIN EFFORT_TABINDICATION_EFFORT ON EFFORT_TABEFFORT_VENUE.EFFORT_ID = EFFORT_TABINDICATION_EFFORT.EFFORT_ID) LEFT JOIN EFFORT_TABINDICATIONS_LIBELLE ON EFFORT_TABINDICATION_EFFORT.IE_N_INDICATIONS = EFFORT_TABINDICATIONS_LIBELLE.N_CODE;

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Autant que je le sache le distinct ne marche pas sur les champs mémo. Ils sont coupés à 255 caractères.
    Si tu as vraiment besoin de ces champs pour éliminer les doublons, il va sans doute falloir faire du code.
    Si tu n'as pas besoin de ces champs, alors fait un distinct sur un sous-ensemble qui inclut un moyen de retrouver le champ mémo et tu fais une jointure.

    La seule astuce que je connaisse pour améliorer un Distinct et de faire une requête d'ajout à une table avec un index unique.
    Tout ce qui est en double est rejeté.

    Une autre possibilité est de faire faire le travail par Oracle en utilisant une requête de type "Pass-Thru" ce qui te permet d'écrire du code SQL Oracle (pour Access c'est du texte sans signification) et de le faire exécuter par Oracle.
    Ça donne généralement de bon résultats (genre passer de 1h à 5 mn) mais il faut connaître le SQL de Oracle.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    merci pour ta réponse
    je vais essayer de faire mon distinct sans les champs Mémo

    là j'étais parti sur un truc hyper tordu : j'ai écrit du code pour "éclater" mes champs Memo en plusieurs champs texte (255) pour ensuite concaténer mes champs Texte pour les reconstituer...

    par contre, le fait de faire exécuter mes requêtes SQL côté Oracle çà m'intéresse si çà me permet de gagner en performance
    ceci dit, j'ai écrit certaine requête en SQL Oracle et le temps d'exécution est quand même super long

    comment fait-on pour exécuter du SQL Oracle depuis Access ?

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    comment fait-on pour exécuter du SQL Oracle depuis Access ?
    On ne peut pas. On peut écrire du SQL Oracle dans Access puis le transmettre à Oracle pour qu'il l'exécute et te retourne le résultat.
    C'est à cela que les requêtes PassThru servent. C'est un des types disponibles dans l'éditeur de requête de Access.
    En fait cela t'ouvre simplement un éditeur de texte (très très très basic) ou tu peux taper le SQL voulu.
    Access ne vérifie rien, si il y a une erreur de syntaxe c'est Oracle qui va te crier dans la face.
    La meilleur solution pour les écrire est de faire cela dans Oracle puis de recopier le SQL, une fois validé, dans Access.

    Si tu n'as pas de gain de performance avec Oracle alors il n'y a sans doute pas grand chose à faire de ce côté.
    Si c'est un traitement que tu ne fais qu'une seule fois, le fait que ce soit lent n'est pas forcément un problème.
    C'est quand c'est répétitif que la vitesse d'exécution peut devenir importante.

    Ceci dit Oracle malgré sa lenteur permet peut-être de faire des distincts sur des champs mémo ce qui faute d'accélérer ton traitement le rendrait sans doute plus simple.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. [Toutes versions] Requête sur deux champs avec doublons.
    Par RKU01 dans le forum Access
    Réponses: 2
    Dernier message: 22/07/2009, 12h19
  2. [AC-2003] Troncage champ mémo requête création de table
    Par Taoueret dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/06/2009, 12h01
  3. [AC-2007] requête suppression sur champ mémo
    Par fred75 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 27/06/2009, 01h53
  4. Requête : distinct sur plusieurs champs
    Par bractar dans le forum Langage SQL
    Réponses: 13
    Dernier message: 08/06/2007, 19h54
  5. Requête SQL tronque un champ mémo avec DISTINCT
    Par ADONET dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/01/2007, 16h06

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