Tsql 这样,如果需要FK到某个时间点,您可以存储userid+版本,但是如果您想FK到当前,只需使用userid,如其中userid=@x和version=0我看到了您对KM关于空字段的评论。。。我想假设唯一可能的空字段是UserUpdate。。。在这种情况下,

Tsql 这样,如果需要FK到某个时间点,您可以存储userid+版本,但是如果您想FK到当前,只需使用userid,如其中userid=@x和version=0我看到了您对KM关于空字段的评论。。。我想假设唯一可能的空字段是UserUpdate。。。在这种情况下,,tsql,max,Tsql,Max,这样,如果需要FK到某个时间点,您可以存储userid+版本,但是如果您想FK到当前,只需使用userid,如其中userid=@x和version=0我看到了您对KM关于空字段的评论。。。我想假设唯一可能的空字段是UserUpdate。。。在这种情况下,只需使用:ISNULL(UserUpdate,GETDATE())听起来像个主意。。。使用您的查询会是什么样子?子查询的处理方式与另一个表一样。我在上面发布了一个示例--希望能有所帮助。哦--你问的是ISNULL函数--对不起--我已经将它添加


这样,如果需要FK到某个时间点,您可以存储userid+版本,但是如果您想FK到当前,只需使用userid,如
其中userid=@x和version=0
我看到了您对KM关于空字段的评论。。。我想假设唯一可能的空字段是UserUpdate。。。在这种情况下,只需使用:ISNULL(UserUpdate,GETDATE())听起来像个主意。。。使用您的查询会是什么样子?子查询的处理方式与另一个表一样。我在上面发布了一个示例--希望能有所帮助。哦--你问的是ISNULL函数--对不起--我已经将它添加到上面的查询中了。
Userid   FirstName   LastName        UserUpdate 
1        Dan         Kramer          1/1/2005  
1        Dan         Kramer          1/1/2007  
1        Dan         Kramer          1/1/2009  
2        Pamella     Slattery        1/1/2005  
2        Pam         Slattery        1/1/2006  
2        Pam         Slattery        1/1/2008  
3        Samamantha  Cohen           1/1/2008  
3        Sam         Cohen           1/1/2009  
Userid   FirstName   LastName        UserUpdate  
1        Dan         Kramer          1/1/2009     
2        Pam         Slattery        1/1/2008   
3        Sam         Cohen           1/1/2009  
Userid   FirstName   LastName        UserUpdate 
1        Dan         Kramer          1/1/2009  
2        Pamella     Slattery        1/1/2005  
2        Pam         Slattery        1/1/2008  
3        Samamantha  Cohen           1/1/2008  
3        Sam         Cohen           1/1/2009 
declare @Table table (userid int,firstname varchar(10),lastname varchar(20), userupdate datetime)
INSERT @Table VALUES (1, 'Dan'         ,'Kramer'          ,'1/1/2005')  
INSERT @Table VALUES (1, 'Dan'         ,'Kramer'          ,'1/1/2007')  
INSERT @Table VALUES (1, 'Dan'         ,'Kramer'          ,'1/1/2009')  
INSERT @Table VALUES (2, 'Pamella'     ,'Slattery'        ,'1/1/2005')  
INSERT @Table VALUES (2, 'Pam'         ,'Slattery'        ,'1/1/2006')  
INSERT @Table VALUES (2, 'Pam'         ,'Slattery'        ,'1/1/2008')  
INSERT @Table VALUES (3, 'Samamantha'  ,'Cohen'           ,'1/1/2008')
INSERT @Table VALUES (3, 'Sam'         ,'Cohen'           ,'1/1/2009') 

SELECT
    dt.Userid,dt.MaxDate
        ,MIN(a.FirstName) AS FirstName, MIN(a.LastName) AS LastName
    FROM (SELECT 
              Userid, Max(UserUpdate) AS MaxDate 
              FROM @Table GROUP BY Userid
         ) dt
        INNER JOIN @Table a ON dt.Userid=a.Userid and dt.MaxDate =a.UserUpdate
    GROUP BY dt.Userid,dt.MaxDate
Userid      MaxDate                 FirstName  LastName
----------- ----------------------- ---------- --------------------
1           2009-01-01 00:00:00.000 Dan        Kramer
2           2008-01-01 00:00:00.000 Pam        Slattery
3           2009-01-01 00:00:00.000 Sam        Cohen
SELECT
   a.userID,
   a.FirstName,
   a.LastName,
   b.MaxDate
FROM
      myTable a
   INNER JOIN
      (   SELECT
             UserID,
             Max(ISNULL(UserUpdate,GETDATE())) as MaxDate
          FROM
             myTable
          GROUP BY
             UserID
      ) b
   ON
          a.UserID = b.UserID
      AND a.UserUpdate = b.MaxDate
Userid   UserUpdate  
1        1/1/2009     
2        1/1/2008   
3        1/1/2009 
Userid   FirstName   LastName        UserUpdate  
1        Dan         Kramer          1/1/2009     
2        Pam         Slattery        1/1/2008   
3        Sam         Cohen           1/1/2009  
Userid   FirstName   LastName 
1        Dan         Kramer   
2        Pam         Slattery 
3        Sam         Cohen
Userid   UserUpdate  
1        1/1/2007     
2        1/1/2007   
3        1/1/2007  
1        1/1/2008     
2        1/1/2008   
3        1/1/2008 
1        1/1/2009     
2        1/1/2009   
3        1/1/2009 
SELECT
   T1.UserID,
   T1.FirstName,
   T1.LastName,
   MAX(ISNULL(T2.UserUpdate,GETDATE()))
FROM
      Table1 T1
   LEFT JOIN
      Table2 T2
   ON
      T1.UserID = T2.UserID
GROUP BY
   T1.UserID,
   T1.FirstName,
   T1.LastName
declare @Table table (userid int,firstname varchar(10),lastname varchar(20), userupdate datetime) 
INSERT @Table VALUES (1, 'Dan'         ,'Kramer'          ,'1/1/2005')   
INSERT @Table VALUES (1, 'Dan'         ,'Kramer'          ,'1/1/2007')   
INSERT @Table VALUES (1, 'Dan'         ,'Kramer'          ,'1/1/2009')   
INSERT @Table VALUES (2, 'Pamella'     ,'Slattery'        ,'1/1/2005')  
INSERT @Table VALUES (2, 'Pam'         ,'Slattery'        ,'1/1/2006')   
INSERT @Table VALUES (2, 'Pam'         ,'Slattery'        ,'1/1/2008')   
INSERT @Table VALUES (3, 'Samamantha'  ,'Cohen'           ,'1/1/2008') 
INSERT @Table VALUES (3, 'Sam'         ,'Cohen'           ,'1/1/2009'); 



with cte ( userid , maxdt ) as 
    (select userid, 
            max(userupdate) 
    from @table 
    group by userid)


SELECT  dt.Userid,
        dt.firstname,
        dt.lastname,
        cte.maxdt

FROM    
    @Table dt
    join cte on cte.userid = dt.userid and dt.userupdate = cte.maxdt
Userid      firstname  lastname             maxdt
----------- ---------- -------------------- -----------------------
3           Sam        Cohen                2009-01-01 00:00:00.000
2           Pam        Slattery             2008-01-01 00:00:00.000
1           Dan        Kramer               2009-01-01 00:00:00.000