2010-05-29 56 views
1

我有两个主从关系的表。 结构或多或少如下: 主表:在master-detail场景中从sql数据库表中选择多条记录

MasterID, DetailID, date, ... 
masterID1, detailID1, 2010/5/1, .... 
masterID2, detailID1, 2008/6/14, ... 
masterID3, detailID1, 2009/5/25, ... 
masterID4, detailID2, 2008/7/24, ... 
masterID5, detailID2, 2010/4/1, ... 
masterID6, detailID4, 2008/9/16, ... 

明细表:

DetailID, ... 
detailID1, ... 
detailID2, ... 
detailID3, ... 
detailID4, ... 

我需要从细节表加上从主表中的最后一个记录所有记录(最后在主表中的日期)。 像这样:

detailID1, masterID1, 2010/5/1, .... 
detailID2, masterID5, 2010/4/1, ... 
detailID3, null, null, ... 
detailID4, masterID6, 2008/9/16, ... 

我不知道如何做到这一点。 任何人都可以帮助我吗? 非常感谢。 Jan

回答

1
Select .... 
From Details As D 
    Left Join (
       Select M1.MasterId, M.DetailId, M.Date... 
       From Master As M1 
       Where MasterId = (
            Select Max(M2.MasterId) 
            From Master As M2 
            Where M2.DetailId = M1.DetailId 
            Group By M2.DetailId 
            Having Max(M2.Date) = M1.Date 
            ) 
       ) As M 
     On M.DetailId = D.DetailId 

我在这里做的是处理关系。如果您有两个具有相同DetailId和Date的主行,则选择MasterId最高的行。

顺便说一句,如果你有公用表表达式(CTE),这个问题就会简单得多。对于CTE,您可以执行类似操作:

With LastMasterRows As 
       (
       Select MasterId, DetailId, Date 
        , Row_Number() Over(Partition By DetailId Order By Date, MasterId) As ItemRank 
       From Master 
       ) 
Select ... 
From Details As D 
    Left Join LastMasterRows As M 
     On M.DetailId = D.DetailId 
      And M.ItemRank = 1 
相关问题