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