如何基于主键在一个表中检索两个表外键数据

时间:2012-08-07 07:49:37

标签: asp.net foreign-keys primary-key

我有以下三个表

文件表

FileId
FileNo

付款表

  Id
  Amount
  FK_FileID

费用表

  Id
  Amount
  FK_FileID

我想输出

FileNo Payment_Amount Expense_Amount
10001         220          150
10001         120          NULL
10001         150          NULL

我想检索文件付款和费用数据。 我在费用中找到了1条记录,在付款方面有3条记录,所以费用的另一行包括空,反之亦然

我该怎么办?

2 个答案:

答案 0 :(得分:0)

使用以下查询...

Select f.FileNo,p.Amount as Payment_Amount,e.Amount as Expense_Amount From File f inner   join        Payment p ON f.FileId = p.FK_FileID inner join Expense e on  e.FileId = p.FK_FileID

答案 1 :(得分:0)

我相信以下内容应该得到你想要的东西,它有点奇怪,但由于付款和费用之间没有关系,所以你必须分开进行,然后加入。您可以使用子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导致的问题。

订购可能是一个问题,因为它取决于哪个表(付款或费用)记录最多。

让我知道你测试时的情况。