少し奇妙ですが、支払いと費用の間には関係がないため、それらを個別に実行してから参加する必要があります。サブ SELECT ステートメントを使用してこれを行うこともできますが、読みやすくするために一時テーブルを使用しました。
SELECT F.FileNo, F.FileId, P.Amount,
ROW_NUMBER() OVER (PARTITION BY P.FileId order by P.Id) AS Row
INTO #Payments
FROM File F
INNER JOIN Payment P ON F.FileId = P.FileId
SELECT F.FileNo, F.FileId, E.Amount,
ROW_NUMBER() OVER (PARTITION BY E.FileId order by E.Id) AS Row
INTO #Expenses
FROM File F
INNER JOIN Expense E ON F.FileId = E.FileId
SELECT COALESCE(tP.FileNo, tE.FileNo) AS FileNo,
tP.amount AS Payment_Amount,
tE.amount AS Expense_Amount
FROM #Payments tP
FULL JOIN #Expenses tE ON tP.FileId = tE.FileId AND tP.Row = tE.Row
ROW_NUMBER() を使用して、特定のファイルに属する可能性のある各支払いおよび経費レコードの FileID に依存する番号を取得しました。次に、FULL JOIN (および FileID) でこれらの値を結合して、1 つのインスタンスのみが結合されるようにします。これにより、3 つのテーブル間の通常の INNER JOIN で発生する問題が解消されます。
どのテーブル (Payment または Expense) に最も多くのレコードがあるかによって、順序付けが問題になる場合があります。
テストしたらどうなるか教えてください。