Bravo, je vois que vous avez mis le "pied à l'étrier". Alors juste quelques conseils...
La syntaxe que vous utilisez est l'ancienne méthode qui permet difficilement de distinguer les égalités assurant les jointures entre tables des filtres sur les enregistrements. Le résultat est le même dans votre cas en écrivant par exemple:
- Code: Tout sélectionner
SELECT m.NUM_SOSA as Sosa_mari
,f.NUM_SOSA as Sosa_femme
, E.EV_FAM_TYPE as Type
, m.NOM||coalesce(' '||m.PRENOM,'') as mari --coalesce car prénom peut être nul
, f.NOM||coalesce(' '||m.PRENOM,'') as femme
,E.EV_FAM_DATE_WRITEN as "Date mariage" --titre entre guillemets car contient mot-clé Date et espace
, E.EV_FAM_VILLE as Ville
, E.EV_FAM_DEPT as Departement
from t_union t
inner join individu m on m.cle_fiche=t.union_mari
inner join individu f on f.cle_fiche=t.union_femme
inner join evenements_fam e on e.ev_fam_kle_famille=t.union_clef and e.ev_fam_type='MARR'
and e.ev_fam_dept<>'' and e.ev_fam_date_year is not null --pour éliminer les mariages sans aucune date
where m.kle_dossier=2 --le champ "dossier" des autres tables (sauf MULTIMEDIAS) est redondant, c'est une anormalité de la base
and (m.num_sosa<512 or f.num_sosa<512) --permet de ne pas ignorer les remariages des sosas
order by e.ev_fam_ville
,e.ev_fam_date_year --assure le tri chronologique si la date n'est pas complète
,e.ev_fam_date nulls last --le champ date est nul si jour mois ou année sont inconnus
,4 --pour définir l'ordre, on peut repérer un champ par son n° de ligne
,5
Cette syntaxe des jointures permet de distinguer en particulier les "inner join" où il doit y avoir une correspondance dans chaque table, des "left join" où un enregistrement de la table précédente peut ne pas avoir de correspondance dans la seconde. Ce n'est pas le cas dans cet exemple, mais c'est très souvent utile.
Pour la concaténation de chaînes de caractères utiliser la barre verticale doublée || mais attention, si dans la concaténation une chaîne est nulle (à distinguer d'une chaîne vide), alors le résultat est nul. C'est pourquoi j'ai utilisé la fonction coalesce dans laquelle le résultat est le deuxième terme si le premier terme est nul (dans la table INDIVIDU le prénom peut être nul).
Les nombres ne devraient pas être mis entre cotes. Firebird l'accepte mais il doit faire la conversion de chaîne de caractères en nombre.
Et pour aller plus loin, je vous conseille
http://sql.developpez.com/ de très bons tutoriels en faisant attention cependant qu'ils ne sont pas spécifiques à Firebird.
Pour les spécificités, les fonctions internes voyez
http://www.firebirdsql.org/file/documen ... upd21.htmlAndré
PS:pour la compréhension, j'ai ajouté des commentaires sur certaines lignes (ils commencent par --). Il faut les supprimer si vous exécutez cette requête dans le BOA qui ne supporte pas ces lignes de commentaires.
Quatrième Loi de Gilb de la Non-Fiabilité.
Un système tendra à grossir dans le sens de la complexité plutôt que de la simplification, jusqu’à ce que l’instabilité résultante devienne intolérable.