1

アクセス 2010 バック エンドと VB.NET フロント エンドでファミリー ツリー アプリケーションを作成しています。(長い話、ここでは関係ありません。) ほとんどすべてが機能しますが、ある人の結婚を分類する必要があります。家族の子供を並べ替える場合と同様に、常に値があるとは限らないため、明白な DateOfBirth または DateOfMarriage フィールドを使用することはできません。これは私のデータ構造の簡単なスナップショットです

People Table                Families Table
- ID                        - ID
- FullName                  - Husband
- DOB (Date of Birth)       - Wife
- DOD (Date of Death)       - DOM (Date of Marriage)

PersonMarriage Table (a linking table)
- Person (foreign key to People)
- Family (foreign key to Families)
- Spouse (foreign key to People)
- Marriage Order (a contrived value to force the order we want)

FamilyChild Table (a linking table)
- Family (foreign key to Families)
- Child  (foreign key to People)
- BirthOrder (a contrived value to force the order we want)

(FWIW、生年月日、日付、結婚は工夫されているため、「1862 年 3 月」や「1753 年より前」などの値を処理できますが、ソート可能性は維持されます。空の文字列は「不明」を意味します)

複雑な比較を使用して部分的な並べ替えを提供できるように、人のすべての結婚に関する関連データを読み取ろうとしています。たとえば、ある人が 2 回結婚しており、結婚の日付がわからない場合、配偶者 B が亡くなった後に配偶者 A の子供が生まれた場合、配偶者 B との結婚が最初に行われたと推測できます。

結婚ごとに、結婚日、配偶者の生年月日、配偶者の生年月日、子供の生年月日を取得したいと考えています。(すべての子供。生年月日の最初の物理レコードを取得するだけです。) 時々機能する SQL クエリを次に示します。

SELECT PersonMarriage.Family, PersonMarriage.Spouse, DOM, s.DOB, s.DOD,
    (SELECT TOP 1 c.DOB FROM FamilyChild 
        LEFT JOIN People c ON FamilyChild.Child=c.ID 
    WHERE c.DOB<>"" AND FamilyChild.Family=PersonMarriage.Family) as ChildDOB 
FROM Families AS f INNER JOIN 
    (PersonMarriage INNER JOIN People AS s ON PersonMarriage.Spouse = s.ID )
ON f.ID = PersonMarriage.Family 
WHERE PersonMarriage.Person=?

子を見つけるために、フィールド リスト内でサブクエリを使用していることに注意してください。子選択サブクエリを FROM 句に移動して LEFT JOIN を使用する必要があることは確かですが、それを行う方法がわかりません。結合順序 FWIW は Access のクエリ ウィザードによって決定されました。

このクエリは、少なくとも 1 つの結婚に生年月日の子供がいる場合にのみ機能するようです。どちらの結婚にも生年月日の子供がいない場合、「このクエリは最大で 1 つの結果を返すことができます」という順序でエラーが発生します。

助言がありますか?

4

1 に答える 1