日期:2014-05-18  浏览次数:20480 次

一对多的查询
Contract   表
字段:[ContractID],[ID],[ContractName],[Signer],[SignTime],[EndTime]
AccountPay表:
字段:ContractID,PaidMoney,PayDate

因为一个Contract有多次付款即AccountPay有多条记录

用left   join   显示后的结果是:
[ContractID],[ContractName],[Signer],[SignTime],[EndTime],PaidMoney,PayDate
    合同1                 合同名称1             签名1           时间1               结束         1000       2006-6
    合同1                 合同名称1             签名1           时间1               结束         2000       2006-7
有没有办法显示成这样:
[ContractID],[ContractName],[Signer],[SignTime],[EndTime],PaidMoney,PayDate
    合同1                 合同名称1             签名1           时间1               结束         1000       2006-6
                                                                                                                        2000       2006-7

即相同的合同只显示一个

------解决方案--------------------
Select
(Case When B.PayDate != C.PayDate Then Null Else A.ContractID End) As ContractID,
(Case When B.PayDate != C.PayDate Then Null Else A.ContractName End) As ContractName,
(Case When B.PayDate != C.PayDate Then Null Else A.Signer End) As Signer,
(Case When B.PayDate != C.PayDate Then Null Else A.SignTime End) As SignTime,
(Case When B.PayDate != C.PayDate Then Null Else A.EndTime End) As EndTime,
B.PaidMoney,
B.PayDate
From
Contract A
Left Join
AccountPay B
On A.ContractID = B.ContractID
Left Join
(Select ContractID, Min(PayDate) As PayDate From AccountPay Group By ContractID) C
On A.ContractID = C.ContractID