Auteur Sujet: liste d'ascendance du sosa 1 avec date et lieu d'union  (Lu 5804 fois)

plus minus reset

0 Membres et 1 Invité sur ce sujet

Hors ligne Helene

  • Expert
  • ****
  • Messages: 114
liste d'ascendance du sosa 1 avec date et lieu d'union
« le: 17 Septembre 2005 à 18:06:59 »
Bonjour,



Je debute un peu avec sql, et d'autres que moi avait fait des propositions bien meilleures dans les messages disparus du forum, mais voici ce que j'ai reussi a faire pour avoir la liste d'ascendance avec les unions. Le mari et la femme sont sur la meme ligne, pour moi ca me va bien car en tassant dans excel j'arrive a imprimer ca en paysage et je trouve ca assez pratique. Mon probleme est que les SOSA 2 (et 3) n'apparaissent pas, car ils n'ont pas d'evenement deces (mais les autres qui sont dans ce cas apparaissent, je n'ai pas tout compris).

Donc tout ca est tres perfectible... J'espere que ca pourra quand meme etre utile a quelqu'un!

Ah oui, il apparait tous les mariages des acendants, y compris ceux qui ne concernent pas deux sosas (exemple : le mariage de mon arriere-grand-pere avec mon arriere-grand-mere, mais aussi son mariage avec sa deuxieme femme). C'est ce que je voulais. Tiens, non, a la reflexion, ca ne doit se produire que pour les ascendants males (donc il faudra que je modifie ca encore un peu...)



Helene



SELECT

  I1.NUM_SOSA,

  I1.NOM AS NOM_MARI,

  I1.PRENOM AS PRENOM_MARI,

  EV11.EV_IND_DATE_WRITEN AS NAISS_MARI,

  EV11.EV_IND_VILLE AS VILLE_NAISS_MARI,

  EV12.EV_IND_DATE_WRITEN AS DECES_MARI,

  EV12.EV_IND_VILLE AS VILLE_DECES_MARI,

  I2.NOM AS NOM_FEMME,

  I2.PRENOM AS PRENOM_FEMME,

  EV21.EV_IND_DATE_WRITEN AS NAISS_FEMME,

  EV21.EV_IND_VILLE AS VILLE_NAISS_FEMME,

  EV22.EV_IND_DATE_WRITEN AS DECES_FEMME,

  EV22.EV_IND_VILLE AS VILLE_DECES_FEMME,

  F.EV_FAM_DATE_WRITEN AS MARIAGE,

  F.EV_FAM_VILLE AS VILLE_MARIAGE

FROM

 INDIVIDU I1

 LEFT OUTER JOIN EVENEMENTS_IND EV11 ON (I1.CLE_FICHE=EV11.EV_IND_KLE_FICHE)

 LEFT OUTER JOIN EVENEMENTS_IND EV12 ON (I1.CLE_FICHE=EV12.EV_IND_KLE_FICHE),

 INDIVIDU I2

 LEFT OUTER JOIN EVENEMENTS_IND EV21 ON (I2.CLE_FICHE=EV21.EV_IND_KLE_FICHE)

 LEFT OUTER JOIN EVENEMENTS_IND EV22 ON (I2.CLE_FICHE=EV22.EV_IND_KLE_FICHE),

 T_UNION U

 LEFT OUTER JOIN EVENEMENTS_FAM F ON (U.UNION_CLEF=F.EV_FAM_KLE_FAMILLE)

WHERE

  (I1.CLE_FICHE = U.UNION_MARI) AND

  (I2.CLE_FICHE = U.UNION_FEMME) AND

  (EV11.EV_IND_TYPE = 'BIRT') AND

  (EV21.EV_IND_TYPE = 'BIRT') AND

  (EV12.EV_IND_TYPE = 'DEAT') AND

  (EV22.EV_IND_TYPE = 'DEAT') AND

  (F.EV_FAM_TYPE = 'MARR') AND

  (I1.NUM_SOSA IS NOT NULL)  AND

  (I1.KLE_DOSSIER = 1)

ORDER BY

  I1.NUM_SOSA
 

Hors ligne Gvx

  • AncestroJunior
  • ****
  • Messages: 361
liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #1 le: 17 Septembre 2005 à 23:06:02 »
Bonsoir Helene,



Ta requete marche trés bien sauf si il manque un evenement BIRT, DEAT, ou MARR. (ceci est du a la jointure qui oblige a l'existence d'un enregistrement)

Pour corriger, je te propose la solution suivante qui utilise des sous requetes:



SELECT

I1.NUM_SOSA,

I1.NOM AS NOM_MARI,

I1.PRENOM AS PRENOM_MARI,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS NAISS_MARI,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS VILLE_NAISS_MARI,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS DECES_MARI,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS VILLE_DECES_MARI,

I2.NOM AS NOM_FEMME,

I2.PRENOM AS PRENOM_FEMME,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS NAISS_FEMME,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS VILLE_NAISS_FEMME,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS DECES_FEMME,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS VILLE_DECES_FEMME,

(SELECT EV_FAM_DATE_WRITEN FROM EVENEMENTS_FAM WHERE (U.UNION_CLEF=EV_FAM_KLE_FAMILLE) AND (EV_FAM_TYPE = 'MARR')) AS MARIAGE,

(SELECT EV_FAM_VILLE FROM EVENEMENTS_FAM WHERE (U.UNION_CLEF=EV_FAM_KLE_FAMILLE) AND (EV_FAM_TYPE = 'MARR')) AS VILLE_MARIAGE

FROM

INDIVIDU I1,INDIVIDU I2,T_UNION U

WHERE

(I1.CLE_FICHE = U.UNION_MARI) AND

(I2.CLE_FICHE = U.UNION_FEMME) AND

(I1.NUM_SOSA IS NOT NULL) AND

(I1.KLE_DOSSIER = 1)

ORDER BY

I1.NUM_SOSA


Citer
Ah oui, il apparait tous les mariages des acendants, y compris ceux qui ne concernent pas deux sosas (exemple : le mariage de mon arriere-grand-pere avec mon arriere-grand-mere, mais aussi son mariage avec sa deuxieme femme). C'est ce que je voulais. Tiens, non, a la reflexion, ca ne doit se produire que pour les ascendants males (donc il faudra que je modifie ca encore un peu...)


Cette requete le fait pour les hommes et les femmes (la tienne aussi je crois) mais c'est difficilement visible a l'ecran a cause du critère de tri (Soza de l'homme)

Hors ligne Helene

  • Expert
  • ****
  • Messages: 114
liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #2 le: 18 Septembre 2005 à 17:53:35 »
Merci!



Je m'empresse d'essayer.



Helene
 

Hors ligne Gvx

  • AncestroJunior
  • ****
  • Messages: 361
liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #3 le: 18 Septembre 2005 à 21:40:00 »
Citer
C'est ce que je voulais. Tiens, non, a la reflexion, ca ne doit se produire que pour les ascendants males (donc il faudra que je modifie ca encore un peu...)


Aprés reflexion, J'étais tombé sur un cas particulier. Tu avais donc raison.



J'ai donc apporté les modifications nécessaires pour corriger

- Ajout d'une colonne Soza_Femme

- Modification clause WHERE

- Modifiction Claose ORDER BY

SELECT

I1.NUM_SOSA AS SOZA_MARI,

I1.NOM AS NOM_MARI,

I1.PRENOM AS PRENOM_MARI,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS NAISS_MARI,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS VILLE_NAISS_MARI,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS DECES_MARI,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS VILLE_DECES_MARI,

I2.NUM_SOSA AS SOZA_FEMME,

I2.NOM AS NOM_FEMME,

I2.PRENOM AS PRENOM_FEMME,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS NAISS_FEMME,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS VILLE_NAISS_FEMME,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS DECES_FEMME,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS VILLE_DECES_FEMME,

(SELECT EV_FAM_DATE_WRITEN FROM EVENEMENTS_FAM WHERE (U.UNION_CLEF=EV_FAM_KLE_FAMILLE) AND (EV_FAM_TYPE = 'MARR')) AS MARIAGE,

(SELECT EV_FAM_VILLE FROM EVENEMENTS_FAM WHERE (U.UNION_CLEF=EV_FAM_KLE_FAMILLE) AND (EV_FAM_TYPE = 'MARR')) AS VILLE_MARIAGE

FROM

INDIVIDU I1,INDIVIDU I2,T_UNION U

WHERE

(I1.CLE_FICHE = U.UNION_MARI) AND

(I2.CLE_FICHE = U.UNION_FEMME) AND

((I1.NUM_SOSA IS NOT NULL) OR (I2.NUM_SOSA IS NOT NULL)) AND

(I1.KLE_DOSSIER = 1)

ORDER BY

I1.NUM_SOSA,I2.NUM_SOSA;

Hors ligne DDdeBerdeux

liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #4 le: 18 Septembre 2005 à 23:58:01 »
Je ne sais si les sous-requêtes sont plus ou moins efficaces ou rapides que les jointures, mais je trouve plus lisible cette dernière solution. Dans la requête d'Helene, il aurait suffit d'inclure la sélection sur le type de l'évènement à l'intérieur de la jointure plutôt que dans la clause where. Par exemple: INDIVIDU I1

LEFT OUTER JOIN EVENEMENTS_IND EV11 ON I1.CLE_FICHE = EV11.EV_IND_KLE_FICHE AND  EV11.EV_IND_TYPE = 'BIRT'
Il me semble que le BOA accepte cette syntaxe, mais le requêteur émet un message d'erreur non bloquant. Le reste du where modifié par Gvx est ok.

A+

André

PS: les sous-requêtes présentées par Gvx, demandant un lien par champ, ne nécessitent-t-elles pas plus de ressources système? Par curiosité et pour mesurer les temps d'exécution, je vais faire l'essai.
Une application pleinement satisfaisante est toujours complétée par une mise à jour buggée. (Loi des Mises à Jour)
 

Hors ligne DDdeBerdeux

liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #5 le: 19 Septembre 2005 à 10:34:34 »
Pas facile à faire ces essais; il faut redémarrer le PC entre chaque essai pour supprimer l'influence des caches.

Si on appelle S la méthode présentée par Gvx utilisant les sous-requêtes, et J la méthode utilisant les jointures suivante:

SELECT

I1.NUM_SOSA,

I1.NOM AS NOM_MARI,

I1.PRENOM AS PRENOM_MARI,

EV11.EV_IND_DATE_WRITEN AS NAISS_MARI,

EV11.EV_IND_VILLE AS VILLE_NAISS_MARI,

EV12.EV_IND_DATE_WRITEN AS DECES_MARI,

EV12.EV_IND_VILLE AS VILLE_DECES_MARI,

I2.NOM AS NOM_FEMME,

I2.PRENOM AS PRENOM_FEMME,

EV21.EV_IND_DATE_WRITEN AS NAISS_FEMME,

EV21.EV_IND_VILLE AS VILLE_NAISS_FEMME,

EV22.EV_IND_DATE_WRITEN AS DECES_FEMME,

EV22.EV_IND_VILLE AS VILLE_DECES_FEMME,

F.EV_FAM_DATE_WRITEN AS MARIAGE,

F.EV_FAM_VILLE AS VILLE_MARIAGE

FROM

INDIVIDU I1

LEFT OUTER JOIN EVENEMENTS_IND EV11 ON I1.CLE_FICHE=EV11.EV_IND_KLE_FICHE AND EV11.EV_IND_TYPE = 'BIRT'

LEFT OUTER JOIN EVENEMENTS_IND EV12 ON I1.CLE_FICHE=EV12.EV_IND_KLE_FICHE AND EV12.EV_IND_TYPE = 'DEAT',

INDIVIDU I2



LEFT OUTER JOIN EVENEMENTS_IND EV21 ON I2.CLE_FICHE=EV21.EV_IND_KLE_FICHE AND EV21.EV_IND_TYPE = 'BIRT'

LEFT OUTER JOIN EVENEMENTS_IND EV22 ON I2.CLE_FICHE=EV22.EV_IND_KLE_FICHE AND EV22.EV_IND_TYPE = 'DEAT',

T_UNION U

LEFT OUTER JOIN EVENEMENTS_FAM F ON U.UNION_CLEF=F.EV_FAM_KLE_FAMILLE AND F.EV_FAM_TYPE = 'MARR'

WHERE

(I1.CLE_FICHE = U.UNION_MARI) AND

(I2.CLE_FICHE = U.UNION_FEMME) AND

((I1.NUM_SOSA IS NOT NULL) OR (I2.NUM_SOSA IS NOT NULL)) AND

(I1.KLE_DOSSIER = 1)

ORDER BY

I1.NUM_SOSA,I2.NUM_SOSA;
le temps d'exécution de la méthode S est plus court d'un facteur >2 à la première exécution et de 5 les exécutions suivantes, les temps de préparation étant les mêmes.

C'est sans doûte normal puisque en prenant plus de ressources, la méthode S peut exécuter le travail plus vite, dans la mesure où ces ressources sont disponibles. Ce qui est le cas avec nos bases de généalogie qui sont relativement petites (2200 individus chez moi).

Mais pas de panique, j'ose à peine donner les différences en valeur absolues tant elles vont paraître ridicules. Dans le petit tableau ci-dessous, l'indice 1 est pour la première exécution, le 2 pour les suivantes. Les temps sont en secondes:

Méthode               S1         S2        J1        J2

Temps de préparation 0.0203   0.0031  0.0203  0.0031

Temps d'exécution   0.0390   0.0047  0.0828  0.0250




Donc victoire Gvx, d'une courte tête :lol:

A+

André
Une application pleinement satisfaisante est toujours complétée par une mise à jour buggée. (Loi des Mises à Jour)
 

Hors ligne DDdeBerdeux

liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #6 le: 19 Septembre 2005 à 10:50:21 »
La requête d'Hélène me rappelle une autre très peu différente, disparue dans le naufrage de nos chers messages (snif). Il n'y a pas de lignes spécifiques aux  non sosa mais tous les conjoints d'un sosa apparaissent tout de même pour chaque évènement familial. Des colonnes pour les actes trouvés y figurent.SELECT DISTINCT

     I.NUM_SOSA AS SOSA

     , I.NOM

     , I.PRENOM

     , N.EV_IND_DATE_WRITEN AS DATE_NAISSANCE

     , N.EV_IND_VILLE AS VILLE_NAISSANCE

     , N.EV_IND_ACTE AS ACTE_NAISSANCE

     , D.EV_IND_DATE_WRITEN AS DATE_DECES

     , D.EV_IND_VILLE AS VILLE_DECES

     , D.EV_IND_ACTE AS ACTE_DECES

     , R.REF_EVE_LIB_LONG AS TYPE_UNION

     , F.EV_FAM_DATE_WRITEN AS DATE_UNION

     , F.EV_FAM_VILLE AS VILLE_UNION

     , F.EV_FAM_ACTE AS ACTE_UNION

     , IC.NOM AS NOM_CONJOINT

     , IC.PRENOM AS PRENOM_CONJOINT

     , IC.NUM_SOSA AS SOSA_CONJOINT

FROM INDIVIDU I

      LEFT OUTER JOIN EVENEMENTS_IND N ON I.CLE_FICHE = N.EV_IND_KLE_FICHE AND N.EV_IND_TYPE= 'BIRT'

      LEFT OUTER JOIN EVENEMENTS_IND D ON I.CLE_FICHE = D.EV_IND_KLE_FICHE AND D.EV_IND_TYPE= 'DEAT'

      LEFT OUTER JOIN T_UNION U ON I.CLE_FICHE = U.UNION_MARI OR I.CLE_FICHE = U.UNION_FEMME

      LEFT OUTER JOIN INDIVIDU IC ON (U.UNION_MARI = IC.CLE_FICHE OR U.UNION_FEMME = IC.CLE_FICHE) AND IC.CLE_FICHE <> I.CLE_FICHE

      LEFT OUTER JOIN EVENEMENTS_FAM F ON U.UNION_CLEF = F.EV_FAM_KLE_FAMILLE

      LEFT OUTER JOIN REF_EVENEMENTS R ON F.EV_FAM_TYPE =R .REF_EVE_LIB_COURT

WHERE I.KLE_DOSSIER =1

      AND I.NUM_SOSA >0

ORDER BY I.NUM_SOSA
Pour ma part, utilisant FB version serveur et un lien ODBC, j'ai mis cette requête dans les sources extérieures d'OpenOffice, ce qui met à jour le tableau automatiquement, sans avoir à importer entre le requêteur et le tableur, et recommencer la présentation.

La même chose est possible avec excel (si le module Query est installé).

A+

André

PS: si quelqu'un a répertorié et conservé ces anciennes requêtes disparues, il serait sympa de les remettre en ligne.

Cecilon?, Christophe?
Une application pleinement satisfaisante est toujours complétée par une mise à jour buggée. (Loi des Mises à Jour)
 

Hors ligne Gvx

  • AncestroJunior
  • ****
  • Messages: 361
liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #7 le: 19 Septembre 2005 à 21:17:17 »
Citation de: "DDdeberdeux"
Je ne sais si les sous-requêtes sont plus ou moins efficaces ou rapides que les jointures, mais je trouve plus lisible cette dernière solution. Dans la requête d'Helene, il aurait suffit d'inclure la sélection sur le type de l'évènement à l'intérieur de la jointure plutôt que dans la clause where. Par exemple: INDIVIDU I1

LEFT OUTER JOIN EVENEMENTS_IND EV11 ON I1.CLE_FICHE = EV11.EV_IND_KLE_FICHE AND  EV11.EV_IND_TYPE = 'BIRT'
Il me semble que le BOA accepte cette syntaxe, mais le requêteur émet un message d'erreur non bloquant. Le reste du where modifié par Gvx est ok.

A+

André

PS: les sous-requêtes présentées par Gvx, demandant un lien par champ, ne nécessitent-t-elles pas plus de ressources système? Par curiosité et pour mesurer les temps d'exécution, je vais faire l'essai.




Il me semble qu'avec les jointures, si la condition n'existe pas (Absence d'enregistrement dans la seconde table correspondant a la premiere) aucune ligne n'est retournée alors qu'une sous requete retourne eventuelllement un NULL dans la ligne.



Exemple

Un individu n'ayant pas d'evenement décés (DEAT) ne sera pas resorti par la requete avec jointure, alors qu'une sous requete le permettra (avec un NULL dans "les Champs Décés")

Hors ligne Gvx

  • AncestroJunior
  • ****
  • Messages: 361
liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #8 le: 19 Septembre 2005 à 21:32:41 »
Citation de: "DDdeberdeux"
PS: si quelqu'un a répertorié et conservé ces anciennes requêtes disparues, il serait sympa de les remettre en ligne.




En voici deux de Lya:

/* la liste des personnes du dossier n° 1 nées, décédées ou mariées dans un département ( ici le Nord ) :

/* liste des individus nés, décédés ou ayant un évé familial dans le département du Nord par Lya */

      SELECT DISTINCT

      I.NUM_SOSA,

      I.NOM,

      I.PRENOM,

      N.EV_IND_DATE_WRITEN AS DATE_NAISSANCE,

      N.EV_IND_VILLE AS VILLE_NAISSANCE,

      D.EV_IND_DATE_WRITEN AS DATE_DECES,

      D.EV_IND_VILLE AS VILLE_DECES,

      INDIVIDU.NUM_SOSA AS SOSA_CONJOINT,

      INDIVIDU.NOM AS NOM_CONJOINT,

      INDIVIDU.PRENOM AS PRENOM_CONJOINT,

      F.EV_FAM_TYPE,

      F.EV_FAM_VILLE,

      F.EV_FAM_DATE_WRITEN AS DATE_EV_FAM

      FROM

      INDIVIDU I

      LEFT OUTER JOIN EVENEMENTS_IND N ON (I.CLE_FICHE=N.EV_IND_KLE_FICHE)

      LEFT OUTER JOIN EVENEMENTS_IND D ON (I.CLE_FICHE=D.EV_IND_KLE_FICHE)

      LEFT OUTER JOIN T_UNION U ON (I.CLE_FICHE=U.UNION_FEMME)

      LEFT OUTER JOIN EVENEMENTS_FAM F ON (U.UNION_CLEF=F.EV_FAM_KLE_FAMILLE)

      LEFT OUTER JOIN INDIVIDU ON (U.UNION_MARI=INDIVIDU.CLE_FICHE)

      WHERE

      (I.SEXE = 2) AND

      ((N.EV_IND_DEPT = 'Nord') OR

      (D.EV_IND_DEPT = 'Nord') OR

      (F.EV_FAM_DEPT = 'Nord')) AND

      (N.EV_IND_TYPE = 'BIRT') AND

      (D.EV_IND_TYPE = 'DEAT') AND

      (I.KLE_DOSSIER = 1)

      UNION

      SELECT DISTINCT

      I.NUM_SOSA,

      I.NOM,

      I.PRENOM,

      N.EV_IND_DATE_WRITEN AS DATE_NAISSANCE,

      N.EV_IND_VILLE AS VILLE_NAISSANCE,

      D.EV_IND_DATE_WRITEN AS DATE_DECES,

      D.EV_IND_VILLE AS VILLE_DECES,

      INDIVIDU.NUM_SOSA AS SOSA_CONJOINT,

      INDIVIDU.NOM AS NOM_CONJOINT,

      INDIVIDU.PRENOM AS PRENOM_CONJOINT,

      F.EV_FAM_TYPE,

      F.EV_FAM_VILLE,

      F.EV_FAM_DATE_WRITEN AS DATE_EV_FAM

      FROM

      INDIVIDU I

      LEFT OUTER JOIN EVENEMENTS_IND N ON (I.CLE_FICHE=N.EV_IND_KLE_FICHE)

      LEFT OUTER JOIN EVENEMENTS_IND D ON (I.CLE_FICHE=D.EV_IND_KLE_FICHE)

      LEFT OUTER JOIN T_UNION U ON (I.CLE_FICHE=U.UNION_MARI)

      LEFT OUTER JOIN EVENEMENTS_FAM F ON (U.UNION_CLEF=F.EV_FAM_KLE_FAMILLE)

      LEFT OUTER JOIN INDIVIDU ON (U.UNION_FEMME=INDIVIDU.CLE_FICHE)

      WHERE

      (I.SEXE = 1) AND

      ((N.EV_IND_DEPT = 'Nord') OR

      (D.EV_IND_DEPT = 'Nord') OR

      (F.EV_FAM_DEPT = 'Nord')) AND

      (N.EV_IND_TYPE = 'BIRT') AND

      (D.EV_IND_TYPE = 'DEAT') AND

      (I.KLE_DOSSIER = 1)

      ORDER BY 2,3


/* la liste des personnes du dossier n° 1 nées, décédées ou ayant un événement familial dans une ville particulière (ici : Quiévy ) :

/* liste des individus du dossier n° 1 nés, décédés ou ayant un évé familial dans la ville de Quiévy par Lya */

      SELECT DISTINCT

      I.NUM_SOSA,

      I.NOM,

      I.PRENOM,

      N.EV_IND_DATE_WRITEN AS DATE_NAISSANCE,

      N.EV_IND_VILLE AS VILLE_NAISSANCE,

      D.EV_IND_DATE_WRITEN AS DATE_DECES,

      D.EV_IND_VILLE AS VILLE_DECES,

      REF_EVENEMENTS.REF_EVE_LIB_LONG,

      F.EV_FAM_DATE_WRITEN AS DATE_EV_FAM,

      F.EV_FAM_VILLE,

      INDIVIDU.NOM AS NOM_CONJOINT,

      INDIVIDU.PRENOM AS PRENOM_CONJOINT,

      INDIVIDU.NUM_SOSA AS SOSA_CONJOINT

      FROM

      INDIVIDU I

      LEFT OUTER JOIN EVENEMENTS_IND N ON (I.CLE_FICHE=N.EV_IND_KLE_FICHE)

      LEFT OUTER JOIN EVENEMENTS_IND D ON (I.CLE_FICHE=D.EV_IND_KLE_FICHE)

      LEFT OUTER JOIN T_UNION U ON (I.CLE_FICHE=U.UNION_FEMME)

      LEFT OUTER JOIN EVENEMENTS_FAM F ON (U.UNION_CLEF=F.EV_FAM_KLE_FAMILLE)

      LEFT OUTER JOIN INDIVIDU ON (U.UNION_MARI=INDIVIDU.CLE_FICHE)

      LEFT OUTER JOIN REF_EVENEMENTS ON (F.EV_FAM_TYPE= REF_EVENEMENTS.REF_EVE_LIB_COURT )

      WHERE

      (I.SEXE = 2) AND

      ((N.EV_IND_VILLE = 'Quiévy') OR

      (D.EV_IND_VILLE = 'Quiévy') OR

      (F.EV_FAM_VILLE = 'Quiévy')) AND

      (N.EV_IND_TYPE = 'BIRT') AND

      (D.EV_IND_TYPE = 'DEAT') AND

      (I.KLE_DOSSIER = 1)

      UNION

      SELECT DISTINCT

      I.NUM_SOSA,

      I.NOM,

      I.PRENOM,

      N.EV_IND_DATE_WRITEN AS DATE_NAISSANCE,

      N.EV_IND_VILLE AS VILLE_NAISSANCE,

      D.EV_IND_DATE_WRITEN AS DATE_DECES,

      D.EV_IND_VILLE AS VILLE_DECES,

      REF_EVENEMENTS.REF_EVE_LIB_LONG,

      F.EV_FAM_DATE_WRITEN AS DATE_EV_FAM,

      F.EV_FAM_VILLE,

      INDIVIDU.NOM AS NOM_CONJOINT,

      INDIVIDU.PRENOM AS PRENOM_CONJOINT,

      INDIVIDU.NUM_SOSA AS SOSA_CONJOINT

      FROM

      INDIVIDU I

      LEFT OUTER JOIN EVENEMENTS_IND N ON (I.CLE_FICHE=N.EV_IND_KLE_FICHE)

      LEFT OUTER JOIN EVENEMENTS_IND D ON (I.CLE_FICHE=D.EV_IND_KLE_FICHE)

      LEFT OUTER JOIN T_UNION U ON (I.CLE_FICHE=U.UNION_MARI)

      LEFT OUTER JOIN EVENEMENTS_FAM F ON (U.UNION_CLEF=F.EV_FAM_KLE_FAMILLE)

      LEFT OUTER JOIN INDIVIDU ON (U.UNION_FEMME=INDIVIDU.CLE_FICHE)

      LEFT OUTER JOIN REF_EVENEMENTS ON (F.EV_FAM_TYPE= REF_EVENEMENTS.REF_EVE_LIB_COURT )

      WHERE

      (I.SEXE = 1) AND

      ((N.EV_IND_VILLE = 'Quiévy') OR

      (D.EV_IND_VILLE = 'Quiévy') OR

      (F.EV_FAM_VILLE = 'Quiévy')) AND

      (N.EV_IND_TYPE = 'BIRT') AND

      (D.EV_IND_TYPE = 'DEAT') AND

      (I.KLE_DOSSIER = 1)

      ORDER BY 2,3


Hors ligne DDdeBerdeux

liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #9 le: 19 Septembre 2005 à 21:43:28 »
Citation de: "Gvx"
Il me semble qu'avec les jointures, si la condition n'existe pas (Absence d'enregistrement dans la seconde table correspondant a la premiere) aucune ligne n'est retournée alors qu'une sous requete retourne eventuelllement un NULL dans la ligne.



Exemple

Un individu n'ayant pas d'evenement décés (DEAT) ne sera pas resorti par la requete avec jointure, alors qu'une sous requete le permettra (avec un NULL dans "les Champs Décés")
Tout dépend de la jointure.

La jointure [INNER] JOIN (INNER étant facultatif) demande effectivement la présence de la correspondance dans les deux tables.

La jointure LEFT ou RIGHT [OUTER] JOIN sortira l'enregistrement, même s'il n'existe que d'un côté (première table pour LEFT, seconde pour RIGHT)

La jointure FULL [OUTER] JOIN sortira tous les enregistrements, même s'ils n'existent que dans une table.

D'après ce que j'ai compris (je ne suis qu'un apprenti).

A+

André
Une application pleinement satisfaisante est toujours complétée par une mise à jour buggée. (Loi des Mises à Jour)
 

Hors ligne DDdeBerdeux

liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #10 le: 19 Septembre 2005 à 22:07:41 »
Citation de: "Gvx"
En voici deux de Lya
La requête que j'ai remise en ligne à 10h50 est une simplification des requêtes de Lya (une seule requête valable pour les 2 sexes, au lieu de 2 requêtes successives liées par le UNION), et une amélioration, car en incluant la sélection sur les évènements 'BIRT' ou 'DEAT' dans la jointure gauche, l'enregistrement est édité même si ces évènements n'existent pas. (notre discussion précédente).

Pour ne sélectionner que ceux qui ont leur naissance ou leur décès ou un évènement familial dans une ville ou un département, il suffit de rajouter ces sélections dans la clause WHERE (une seule) comme l'a fait Lya.

A+

André
Une application pleinement satisfaisante est toujours complétée par une mise à jour buggée. (Loi des Mises à Jour)
 

Hors ligne Gvx

  • AncestroJunior
  • ****
  • Messages: 361
liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #11 le: 19 Septembre 2005 à 22:57:08 »
Citation de: "DDdeberdeux"
Citation de: "Gvx"
Il me semble qu'avec les jointures, si la condition n'existe pas (Absence d'enregistrement dans la seconde table correspondant a la premiere) aucune ligne n'est retournée alors qu'une sous requete retourne eventuelllement un NULL dans la ligne.



Exemple

Un individu n'ayant pas d'evenement décés (DEAT) ne sera pas resorti par la requete avec jointure, alors qu'une sous requete le permettra (avec un NULL dans "les Champs Décés")
Tout dépend de la jointure.

La jointure [INNER] JOIN (INNER étant facultatif) demande effectivement la présence de la correspondance dans les deux tables.

La jointure LEFT ou RIGHT [OUTER] JOIN sortira l'enregistrement, même s'il n'existe que d'un côté (première table pour LEFT, seconde pour RIGHT)

La jointure FULL [OUTER] JOIN sortira tous les enregistrements, même s'ils n'existent que dans une table.

D'après ce que j'ai compris (je ne suis qu'un apprenti).

A+

André




Apparament lorsqu'il y a plusieurs jointures cela devient tres difficile (apparement la premiere jointue oblige a avoir un enregistrement (Naissance) pour avoir la seconde.



A comparer le nombre de ligne de ces deux requetes:

SELECT

I1.NUM_SOSA AS SOZA_MARI,

I1.NOM AS NOM_MARI,

I1.PRENOM AS PRENOM_MARI,

EV11.EV_IND_DATE_WRITEN AS NAISS_MARI,

EV11.EV_IND_VILLE AS VILLE_NAISS_MARI,

EV12.EV_IND_DATE_WRITEN AS DECES_MARI,

EV12.EV_IND_VILLE AS VILLE_DECES_MARI,

I2.NUM_SOSA AS SOZA_FEME,

I2.NOM AS NOM_FEMME,

I2.PRENOM AS PRENOM_FEMME,

EV21.EV_IND_DATE_WRITEN AS NAISS_FEMME,

EV21.EV_IND_VILLE AS VILLE_NAISS_FEMME,

EV22.EV_IND_DATE_WRITEN AS DECES_FEMME,

EV22.EV_IND_VILLE AS VILLE_DECES_FEMME,

F.EV_FAM_DATE_WRITEN AS MARIAGE,

F.EV_FAM_VILLE AS VILLE_MARIAGE

FROM

INDIVIDU I1

LEFT OUTER JOIN EVENEMENTS_IND EV11 ON (I1.CLE_FICHE=EV11.EV_IND_KLE_FICHE)

LEFT OUTER JOIN EVENEMENTS_IND EV12 ON (I1.CLE_FICHE=EV12.EV_IND_KLE_FICHE),

INDIVIDU I2

LEFT OUTER JOIN EVENEMENTS_IND EV21 ON (I2.CLE_FICHE=EV21.EV_IND_KLE_FICHE)

LEFT OUTER JOIN EVENEMENTS_IND EV22 ON (I2.CLE_FICHE=EV22.EV_IND_KLE_FICHE),

T_UNION U

LEFT OUTER JOIN EVENEMENTS_FAM F ON (U.UNION_CLEF=F.EV_FAM_KLE_FAMILLE)

WHERE

(I1.CLE_FICHE = U.UNION_MARI) AND

(I2.CLE_FICHE = U.UNION_FEMME) AND

(EV11.EV_IND_TYPE = 'BIRT') AND

(EV21.EV_IND_TYPE = 'BIRT') AND

(EV12.EV_IND_TYPE = 'DEAT') AND

(EV22.EV_IND_TYPE = 'DEAT') AND

(F.EV_FAM_TYPE = 'MARR') AND

((I1.NUM_SOSA IS NOT NULL) OR (I2.NUM_SOSA IS NOT NULL)) AND

(I1.KLE_DOSSIER = 1)

ORDER BY

I1.NUM_SOSA


SELECT

I1.NUM_SOSA AS SOZA_MARI,

I1.NOM AS NOM_MARI,

I1.PRENOM AS PRENOM_MARI,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS NAISS_MARI,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS VILLE_NAISS_MARI,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS DECES_MARI,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I1.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS VILLE_DECES_MARI,

I2.NUM_SOSA AS SOZA_FEMME,

I2.NOM AS NOM_FEMME,

I2.PRENOM AS PRENOM_FEMME,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS NAISS_FEMME,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'BIRT')) AS VILLE_NAISS_FEMME,

(SELECT EV_IND_DATE_WRITEN FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS DECES_FEMME,

(SELECT EV_IND_VILLE FROM EVENEMENTS_IND WHERE (I2.CLE_FICHE=EV_IND_KLE_FICHE) AND (EV_IND_TYPE = 'DEAT')) AS VILLE_DECES_FEMME,

(SELECT EV_FAM_DATE_WRITEN FROM EVENEMENTS_FAM WHERE (U.UNION_CLEF=EV_FAM_KLE_FAMILLE) AND (EV_FAM_TYPE = 'MARR')) AS MARIAGE,

(SELECT EV_FAM_VILLE FROM EVENEMENTS_FAM WHERE (U.UNION_CLEF=EV_FAM_KLE_FAMILLE) AND (EV_FAM_TYPE = 'MARR')) AS VILLE_MARIAGE

FROM

INDIVIDU I1,INDIVIDU I2,T_UNION U

WHERE

(I1.CLE_FICHE = U.UNION_MARI) AND

(I2.CLE_FICHE = U.UNION_FEMME) AND

((I1.NUM_SOSA IS NOT NULL) OR (I2.NUM_SOSA IS NOT NULL)) AND

(I1.KLE_DOSSIER = 1)

ORDER BY

I1.NUM_SOSA,I2.NUM_SOSA;




De plus la seconde requete est beaucoup plus rapide dans le BOA sur une base contenant 4749 individus et 1596 unions (memoire 512MO)

Hors ligne DDdeBerdeux

liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #12 le: 19 Septembre 2005 à 23:33:32 »
Il est normal que tu ais moins de lignes dans la première requête puisque les  filtres contenus dans la clause WHERE s'appliquent à la totalité des enregistrements, alors qu'ils ne devraient s'appliquer qu'aux jointures gauches avec les tables évènements.

Il faut donc remplacer:INDIVIDU I1

LEFT OUTER JOIN EVENEMENTS_IND EV11 ON I1.CLE_FICHE=EV11.EV_IND_KLE_FICHE

.....

WHERE

...AND (EV11.EV_IND_TYPE = 'BIRT')...

parINDIVIDU I1

LEFT OUTER JOIN EVENEMENTS_IND EV11 ON I1.CLE_FICHE=EV11.EV_IND_KLE_FICHE AND EV11.EV_IND_TYPE = 'BIRT'

.....

Et là tu devrais avoir le même résultat. Mais pour la rapidité tu as raison, je l'ai mesuré ce matin (message 10h34). La raison doit être due à l'utilisation de plus de ressources dans la seconde requête, ce qui ne pose aucun problème pour nos gros ordinateurs sur nos petites bases, mais dans le cas contraire (très grosse base, peu de mémoire)peut poser des problèmes de mémoire donc utiliser un swap disque très pénalisant qui inverserait les résultats.

A+

André
Une application pleinement satisfaisante est toujours complétée par une mise à jour buggée. (Loi des Mises à Jour)
 

Hors ligne DDdeBerdeux

liste d'ascendance du sosa 1 avec date et lieu d'union
« Réponse #13 le: 20 Septembre 2005 à 12:04:27 »
Pour faire plaisir à tout le monde (ou presque), la requête d'hier 10h50 à laquelle j'ai ajouté les critères de sélection sur ville et département comme Lya (dont on est toujours sans nouvelles?). Le N° du dossier doit évidemment être changé pour le votre.

Pour rendre actifs ces critères il suffit de retirer les symboles de mise en commentaire (/* et */) au début et à la fin de la ligne que l'on veut activer.SELECT DISTINCT

     I.NUM_SOSA AS SOSA,

     I.NOM,

     I.PRENOM,

     N.EV_IND_DATE_WRITEN AS DATE_NAISSANCE,

     N.EV_IND_VILLE AS VILLE_NAISSANCE,

     N.EV_IND_ACTE AS ACTE_NAISSANCE,

     D.EV_IND_DATE_WRITEN AS DATE_DECES,

     D.EV_IND_VILLE AS VILLE_DECES,

     D.EV_IND_ACTE AS ACTE_DECES,

     R.REF_EVE_LIB_LONG AS TYPE_UNION,

     F.EV_FAM_DATE_WRITEN AS DATE_UNION,

     F.EV_FAM_VILLE AS VILLE_UNION,

     F.EV_FAM_ACTE AS ACTE_UNION,

     IC.NOM AS NOM_CONJOINT,

     IC.PRENOM AS PRENOM_CONJOINT,

     IC.NUM_SOSA AS SOSA_CONJOINT

FROM INDIVIDU I

      LEFT OUTER JOIN EVENEMENTS_IND N ON I.CLE_FICHE = N.EV_IND_KLE_FICHE AND N.EV_IND_TYPE= 'BIRT'

      LEFT OUTER JOIN EVENEMENTS_IND D ON I.CLE_FICHE = D.EV_IND_KLE_FICHE AND D.EV_IND_TYPE= 'DEAT'

      LEFT OUTER JOIN T_UNION U ON I.CLE_FICHE = U.UNION_MARI OR I.CLE_FICHE = U.UNION_FEMME

      LEFT OUTER JOIN INDIVIDU IC ON (U.UNION_MARI = IC.CLE_FICHE OR U.UNION_FEMME = IC.CLE_FICHE) AND IC.CLE_FICHE <> I.CLE_FICHE

      LEFT OUTER JOIN EVENEMENTS_FAM F ON U.UNION_CLEF = F.EV_FAM_KLE_FAMILLE

      LEFT OUTER JOIN REF_EVENEMENTS R ON F.EV_FAM_TYPE =R .REF_EVE_LIB_COURT

WHERE I.KLE_DOSSIER =1

      AND I.NUM_SOSA IS NOT NULL

      /* Enlever les symboles de commentaires de la ligne ci-dessous pour sélection sur ville */

     /* AND (N.EV_IND_VILLE='Quiévy' OR D.EV_IND_VILLE='Quiévy' OR F.EV_FAM_VILLE='Quiévy') */

      /* Enlever les symboles de commentaires de la ligne ci-dessous pour sélection sur Département */

      /* AND (N.EV_IND_DEPT='Nord' OR D.EV_IND_DEPT='Nord' OR F.EV_FAM_DEPT='Nord') */
Commentaires pour Gvx:

La dernière requête que tu nous as présentée ci-dessus, qui utilise les sous-requêtes au lieu des jointures, a un inconvénient important. Elle ne sort pas l'individu qui n'a pas d'union, même s'il a un SOSA. Je m'en suis aperçu parce que ma petite fille SOSA n°1 (à 3 ans, on n'enregistre pas les couples de maternelle petite section!), n'est pas éditée.

C'est parce que dans ta requête, la jointure entre les tables INDIVIDU et T_UNION figure dans le WHERE par (I1.CLE_FICHE = U.UNION_MARI) AND (I2.CLE_FICHE = U.UNION_FEMME).

On pourrait penser que le cas du SOSA n°1 est le seul, or il peut exister d'autres SOSA qui n'ont pas d'UNION. Quand un seul des parents est connu, Ancestrologie ne crée pas d'union pour ce parent.



J'ai essayé de mettre ma requête ci-dessus sous une forme n'utilisant que des sous-requêtes, je n'y arrive pas, car chaque sous-requête ne doit renvoyer qu'une seule valeur, or le select de l'union d'un individu peut renvoyer plusieurs unions.



A+

André
Une application pleinement satisfaisante est toujours complétée par une mise à jour buggée. (Loi des Mises à Jour)