Merger des enregistrements

cs_nahoulaa
Messages postés
43
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
7 octobre 2015
- Modifié par cs_nahoulaa le 6/02/2014 à 17:01
jordane45
Messages postés
36045
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 août 2022
- 10 févr. 2014 à 15:09
Bonjour,
Je souhaite avoir une requete qui merge les enregistrements d'une base de données ayant une meme valeur "idLink" (dans l'exemple) el éliminant les renregistrements dominés par d'autres.

soit l'exemple


nom prenom telephone adresse idLink
Bey alex NULL france 1
Bey alex 1234 NULL 1
Der franc 1569 france 2
Der NULL NULL NULL 2


le resultat souhaité de la requete est :

nom prenom telephone adresse idLink
Bey alex 1234 france 1
Der franc 1569 france 2

any help? merci

2 réponses

jordane45
Messages postés
36045
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 août 2022
358
6 févr. 2014 à 19:56
Bonjour,

A première vue (et sans avoir testé) je pense à l'utilisation de sous requêtes

Quelque chose du genre :


SELECT distinct T1.nom
           ,T2.prenom
           ,T3.telephone
           ,T4.adresse
           ,T1.idLink
FROM
  (select distinct idLink,nom from matable x1 where   x1.nom IS NOT NULL) T1
,(select distinct idLink,prenom from matable x2 where   x2.prenom IS NOT NULL) T2
,(select distinct idLink,telephone from matable x3 where   x3.telephone IS NOT NULL) T3
,(select distinct idLink,adresse from matable x4 where   x4.adresse IS NOT NULL) T4
where T1.idLink = T2.idLink
AND T3.idLink = T2.idLink
AND T3.idLink = T4.idLink
group by T1.nom



Y'a surement plus simple... mais là comme ça... je ne trouve pas ^^
0
cs_nahoulaa
Messages postés
43
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
7 octobre 2015

7 févr. 2014 à 11:59
merci
mais le problème avec cette requête est qu'elle ne retourne pas de résultats lorsque un champ est null partout!!!
0
jordane45
Messages postés
36045
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 août 2022
358
7 févr. 2014 à 13:05
Ah ben dans les exemples que tu donnais tu n'avais pas évoqué ce cas là...
Tu peux nous montrer un cas concret ?
0
cs_nahoulaa
Messages postés
43
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
7 octobre 2015

7 févr. 2014 à 13:55
Pour le cas ou on a :
nom  prenom telephone adresse idLink
Bey alex NULL france 1
Bey alex NULL NULL 1
Bey alex NULL NULL 1
Bey alexandre NULL NULL 1

on souhaite avoir comme résultat :
nom prenom telephone adresse idLink
Bey alex NULL france 1
Bey alexandre NULL france 1

MERCI POUR VOTRE AIDE :)
0
jordane45
Messages postés
36045
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 août 2022
358
8 févr. 2014 à 01:54
oula... pas évident ....

Sans trop vouloir critiquer... pour en arriver à devoir créer des requêtes aussi biscornues (de vrais usines à gaz...) c'est qu'il y a un souci au niveau de la conception de la BDD...

Sinon au niveau de la requête il va falloir ajouter des IF ou des WHEN
(la doc est disponibles sur le net).

SELECT
   CASE   WHEN "condition1" THEN "résultat1"
               WHEN "condition2" THEN "résultat2"
                ...
               [ELSE "résultatN"]
  END
FROM "nom de table";


Pour chaque colonne de ta table (dans la liste des champs à remonter de ton SELECT ...... ) Ajouter un bloc CASE si T1.valeur IS NOT NULL Alors T1.valeur .. Sinon.. Si T2.valeur IS NOT NULL Alors T2.value.....
bref..Un machin dans ce genre là quoi...

A mon avis, comme je te l'ai suggéré quelques lignes auparavant, tu auras mieux fait de repenser ta BDD ..Une personne ne peut/doit exister qu'une seule fois.. Donc aussi bien lors de sa création que de ses MAJ il ne faut manipuler qu'UNE seule ligne de ta BDD ...
0
cs_Robert33
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
32
8 févr. 2014 à 10:20
Bonjour

Comme le souligne Jordane "une personne ne doit exister qu'une seule fois"
Si non pour la fusion des valeurs quelque chose comme :
SELECT 
MAX(nom) AS nom, 
MAX(prenom) AS prenom, 
MAX(telephone) AS telephone, 
MAX(adresse) AS adresse, 
idLink
FROM matable
GROUP BY idLink


note que l'on peut toujours ajouter des champs Group By pour filtrer les singularités, ex:
SELECT
MAX(nom) AS nom, 
MAX(prenom) AS prenom, 
MAX(telephone) AS telephone, 
MAX(adresse) AS adresse, 
idLink
FROM matable
GROUP BY idLink, nom + prenom
HAVING (nom + prenom IS NOT NULL)

mais là on rentre dans l'ésotérique.
0
jordane45
Messages postés
36045
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 août 2022
358
8 févr. 2014 à 13:43
oula.. mais quel boulet je suis.. MAX.. je n'y avais même pas pensé.....
je pense que ça devrait épondre à la question de Nahoula.
0
cs_Robert33
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
32
8 févr. 2014 à 15:20
ben on peut pas penser à tout, faut en laisser un peu aux autres
et des fois on va chercher de ces trucs ...
0
cs_nahoulaa
Messages postés
43
Date d'inscription
mercredi 12 août 2009
Statut
Membre
Dernière intervention
7 octobre 2015

10 févr. 2014 à 14:42
merci
Merci. mais la requête ne résout pas le problème dans le cas ou on a, par exemple, deux enregistrements avec deux adresse différentes et qu'on veut garder les 2 ou lorsque les prenoms sont NULL. On cherche à éliminer les enregistrements dominés

soit l'exemple :

nom  prenom telephone adresse idLink
Bey alex NULL france 1
Bey alex NULL NULL 1
Bey null 0656 italie 1
Bey alex 0656 NULL 1

se qu'on veut avoir comme retour :

nom  prenom telephone adresse idLink
Bey alex NULL france 1
Bey alex 0656 italie 1


L'idée de ces requetes est de nettoyer une BDD existante qui peut contenir des redondances et qu'on peut pas controler les MAJ auparavant...
0