Et dans Ancestrologie, tout au moins la base, il y a une procédure que j'avais concoctée il y a déjà pas mal de temps dans ce but. En voici l'entête:
PROCEDURE PROC_ANC_COMMUNS (
INDIVIDU INTEGER,
INDIVIDU2 INTEGER)
RETURNS (
COMMUN INTEGER,
ENFANT_1 INTEGER,
NIVEAU_MIN_1 INTEGER,
ENFANT_2 INTEGER,
NIVEAU_MIN_2 INTEGER)
AS
begin
/*Procédure créée par André. Dernière modification: 02/08/2007
Cette procédure liste les ancêtres communs à 2 individus. INDIVIDU et INDIVIDU2
ENFANT_1 et ENFANT_2 sont les enfants de l'ancêtre à l'origine de la branche
arrivant respectivement à INDIVIDU et INDIVIDU2. NIVEAU_MIN_1 et NIVEAU_MIN_2
sont les nombres de générations minimum séparant respectivement INDIVIDU et
INDIVIDU2 de l'ancêtre en passant par les branches issues de ENFANT_1 et ENFANT_2.
Si INDIVIDU2 est nul (zéro), les ancêtres communs aux parents de INDIVIDU sont recherchés.
Les nombres de générations sont celles qui séparent INDIVIDU de son ancêtre par
chacune des branches paternelle et maternelle.*/
Cette procédure référençant les individus par leurs code (NIP), il faut faire les jointures avec la table INDIVIDU pour afficher les noms et prénoms, comme ci-dessous:
select
(select nom||coalesce(', '||prenom,'')||' NIP: '||cle_fiche
from individu where cle_fiche=p.commun) as ANCETRE
,(select p.niveau_min_1||' générations par '
||nom||coalesce(', '||prenom,'')||' NIP: '||cle_fiche
from individu where cle_fiche=p.enfant_1) as PAR_ENFANT_1
,(select p.niveau_min_2||' générations par '
||nom||coalesce(', '||prenom,'')||' NIP: '||cle_fiche
from individu where cle_fiche=p.enfant_2) as PAR_ENFANT_2
from proc_anc_communs(291,0) p
order by p.niveau_min_1
Mais vous allez constater que si votre famille s'est peu déplacée, comme dans le diagramme des ascendants dont parle Horemans, celà devient rapidement un vrai sac de noeuds difficile à comprendre. Aussi la requête suivante donne uniquement les noms de ces ancêtres communs:
select distinct
(select nom||coalesce(', '||prenom,'')||' NIP: '||cle_fiche
from individu where cle_fiche=p.commun) as ANCETRE
from proc_anc_communs(291,0) p
order by p.niveau_min_1
Dans les requêtes exemples ci-dessus, j'ai recherché les ancêtres communs à l'individu 291. Il faut donc remplacé ce code par celui du votre, et si vous recherchez les ancêtres communs à cet individu et un autre, remplacez "0" par le code de ce dernier.
A+
André