我相信以下应该得到你想要的,它有点奇怪,但由于付款和费用之间没有关系,所以你必须分开做然后加入。您可以使用子 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)中加入这些值,以便只加入一个实例,这消除了三个表之间的正常 INNER JOIN 会导致的问题。
排序可能是一个问题,因为它取决于哪个表(付款或费用)的记录最多。
当你测试它时让我知道它是如何进行的。