Partage
  • Partager sur Facebook
  • Partager sur Twitter

Doublons dans une requête avec INNER JOIN

éliminer les doublons dans une requête comportant des jointures

    19 mai 2019 à 13:58:29

    Bonjour,

    J'ai cette requête SQL qui me renvoie 23 millions de lignes.

    SELECT 
         code_element AS cd_box,
         cd_code AS cd_charact,
         CASE  
            WHEN (idtype_valeur=1 OR idtype_valeur=2) AND (valeur_texte!='null' AND valeur_texte='t') THEN 'OUI'
            WHEN (idtype_valeur=1 OR idtype_valeur=2) AND (valeur_texte!='null' AND valeur_texte='f') THEN 'NON'
         END AS txt_charact_value,
         null as row_id,
         CASE  
            WHEN (idtype_valeur=9 OR idtype_valeur=10 OR idtype_valeur=11) THEN TO_CHAR(valeur_num)
         END AS val_charact_value,
         CASE  
            WHEN (idtype_valeur=3 OR idtype_valeur=5) THEN TO_CHAR(valeur_date)
         END AS dttm_charact_value,
         code_param AS cd_param,
         index_tableau AS val_charact
    FROM (
        SELECT 
            *
        FROM 
           stg_tempo1
        INNER JOIN stg_tempo2
        ON (stg_tempo1.code_caracteristique = stg_tempo2.name AND stg_tempo1.code_type_element = stg_tempo2.code)
    ) charact1
    INNER JOIN stg_reprisemaskeqrevu
    ON (charact1.code_caracteristique = stg_reprisemaskeqrevu.code_caracteristique_metro)


    Mon objectif est de ne pas prendre les lignes où les champs cd_box, cd_charact, cd_param et val_charact sont les mêmes et garder que la première ligne rencontrer dans l'enregistrement. Je m'explique :

    Supposant que cette requête me renvoie l'enregistrement ci-dessous :

    Je veux supprimer les lignes où field2 et field4 ont la même valeur et garder que la première ligne de ces doublons. Le résultat que j'attendais était ceci :

    J'ai vraiment besoin d'aide. J'ai pensé à jouer sur les MIN(rowid) mais le résultat de ma requête n'est pas encore stocké en base. il faut que je supprime d'abord ces doublons (avec les contraintes expliquées).
    J'ai aussi essayé avec

    row_number() over (partition by cd_box, cd_charact, cd_param, val_charact order by cd_box)

    mais j'ai un problème de tablespace...

    • Partager sur Facebook
    • Partager sur Twitter
    Un jour sans Internet, c'est comme une année sans pluie.
      19 mai 2019 à 16:57:28

      Bonjour,

      Peux-tu nous dire dans quelle table se trouve les colonnes code_element, cd_code, code_param et index_tableau ?

      Au passage je ne comprends pas l'intérêt de la sous-requête du FROM si tu ne fais aucun filtre ou agrégat ...

      Tu pourrais juste écrire :

      SELECT ...
      FROM
      	stg_tempo1 T1
      		INNER JOIN stg_tempo2 T2
      			ON T1.code_caracteristique = T2.name
      			AND T1.code_type_element = T2.code
      		INNER JOIN stg_reprisemaskeqrevu R
      			ON T1.code_caracteristique = R.code_caracteristique_metro

      -
      Edité par Benzouye 19 mai 2019 à 17:05:09

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

      Doublons dans une requête avec INNER JOIN

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown