return: text lang: plpgsql src: | DECLARE _sqlcmd TEXT; result TEXT; BEGIN -- Le nom_naissance dans certains prestataires est récupéré sous le format NULL pour indiquer la non saisie de ce champ -- Historiquement dans les prestataires, le nom_naissance non renseigné était enregistré au format chaîne vide ('') -- Les requêtes suivantes et la table p_personne attendent que la colonne nom_naissance soit au format chaîne lorsque vide UPDATE rh.p_salaries SET nom_naissance = '' WHERE nom_naissance IS NULL ; -- Extraction par nom DROP TABLE IF EXISTS w_fusion_salaries; CREATE TEMP TABLE w_fusion_salaries AS SELECT *, '0'::text AS origine, base.cti_soundex_nom(nom) AS nom_soundex, base.cti_soundex_prenom(prenom) AS prenom_soundex FROM rh.p_salaries WHERE nom <> '' AND (nom_naissance = nom OR nom_naissance = '') AND oid IN (SELECT salarie_id FROM rh.p_contrats); -- Extraction par nom de naissance INSERT INTO w_fusion_salaries SELECT *, '1'::text AS origine, base.cti_soundex_nom(nom_naissance) AS nom_soundex, base.cti_soundex_prenom(prenom) AS prenom_soundex FROM rh.p_salaries WHERE nom <> '' AND nom_naissance <> '' AND nom_naissance <> nom AND oid IN (SELECT salarie_id FROM rh.p_contrats); -- Table temporaire des personnes avec -- regroupement par nom/nom_naissance, prénom, date_naissance, sexe -- identifiant md5 (clé de la personne) utilisant nom de naissance DROP TABLE IF EXISTS w_personne; CREATE TEMP TABLE w_personne AS SELECT COALESCE(salarie_courant_id, w_fusion_salaries.oid) AS salarie_courant_id, md5( MAX( CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN base.cti_soundex_nom(CASE WHEN nom_naissance <> '' THEN nom_naissance ELSE nom END) || base.cti_soundex_prenom(prenom) || w_fusion_salaries.date_naissance || w_fusion_salaries.sexe ELSE NULL END) ) AS cle_interne, MAX(CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN w_fusion_salaries.nom ELSE NULL END) AS nom, MAX(CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN w_fusion_salaries.nom_naissance ELSE NULL END) AS nom_naissance, MAX(CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN w_fusion_salaries.prenom ELSE NULL END) AS prenom, MAX(w_fusion_salaries.date_naissance) AS date_naissance, MAX(w_fusion_salaries.sexe) AS sexe, MAX(CASE WHEN w_fusion_salaries.oid = salarie_courant_id OR subview.salarie_courant_id IS NULL THEN w_fusion_salaries.matricule ELSE NULL END) AS matricule_courant, MAX( CASE WHEN w_fusion_salaries.oid = subview.salarie_courant_id THEN salarie_array_id WHEN subview.salarie_courant_id IS NULL THEN Array[w_fusion_salaries.oid] ELSE NULL END ) AS salarie_array_id FROM w_fusion_salaries LEFT JOIN ( SELECT nom_soundex, prenom_soundex, date_naissance, sexe, count(*) AS nb, (MAX(ARRAY[date_debut::text,oid::text]))[2]::bigint AS salarie_courant_id, base.cti_array_accum(w_fusion_salaries.oid) AS salarie_array_id FROM w_fusion_salaries GROUP BY 1,2,3,4 HAVING count(*) > 1 ) subview ON w_fusion_salaries.oid = ANY(salarie_array_id) GROUP BY 1 ; -- Mise à jour table p_personnes UPDATE rh.p_personne SET nom = w_personne.nom, nom_naissance = w_personne.nom_naissance, prenom = w_personne.prenom, salarie_courant_id = w_personne.salarie_courant_id, salarie_array_id = w_personne.salarie_array_id, matricule_courant = w_personne.matricule_courant FROM w_personne WHERE p_personne.cle_interne = w_personne.cle_interne AND ( p_personne.nom IS DISTINCT FROM w_personne.nom OR p_personne.nom_naissance IS DISTINCT FROM w_personne.nom_naissance OR p_personne.prenom IS DISTINCT FROM w_personne.prenom OR p_personne.salarie_courant_id IS DISTINCT FROM w_personne.salarie_courant_id OR p_personne.salarie_array_id IS DISTINCT FROM w_personne.salarie_array_id OR p_personne.matricule_courant IS DISTINCT FROM w_personne.matricule_courant ) ; INSERT INTO rh.p_personne (cle_interne, nom, nom_naissance, prenom, date_naissance, sexe, salarie_courant_id, salarie_array_id, matricule_courant) SELECT cle_interne, nom, nom_naissance, prenom, date_naissance, sexe, salarie_courant_id, salarie_array_id, matricule_courant FROm w_personne WHERE cle_interne NOT IN (SELECT cle_interne FROM rh.p_personne) ; -- Mise à jour table p_salaries UPDATE rh.p_salaries SET personne_id = p_personne.oid FROM rh.p_personne WHERE p_salaries.oid = ANY(p_personne.salarie_array_id) ; RETURN 'OK'; END;