所以我的方案......我需要在ActivityDate
表中更新2列Activity
和User
。日期需要从其他两个表格MAX(DATE)
或Notes
中的一个设置为Tasks
,而活动代码则根据哪个活动具有最大日期来设置。我不确定我怎么能这样做......
实施例
用户表 - 目前
UserID ActivityDate Activity
1 NULL NULL
2 NULL NULL
3 NULL NULL
4 NULL NULL
注释表:
UserID PostedDate Activity
1 2015-01-01 10:15:00.000 1
2 2015-02-01 10:15:00.000 1
3 2015-03-01 10:15:00.000 1
4 2015-04-01 10:15:00.000 1
任务表:
UserID PostedDate Activity
1 2015-01-15 11:30:00.000 2
2 2015-01-15 11:30:00.000 2
3 2015-05-01 11:30:00.000 2
4 2015-02-05 11:30:00.000 2
用户表 - 我需要看的东西
UserID ActivityDate Activity
1 2015-01-15 11:30:00.000 2
2 2015-02-01 10:15:00.000 1
3 2015-05-01 11:30:00.000 2
4 2015-04-01 10:15:00.000 1
你可以看到,我需要MAX(DATE)&要更新的活动。是否有一种简单的方法可以获得650万行这样的东西?
答案 0 :(得分:1)
容易吗?不需要。您需要做的是将两个表格放在一起,并使用UNION
,然后找到每个UserID的最大日期,然后重新加入与最大日期匹配的特定记录日期。
我认为这会奏效......
SELECT
'UPDATE [User Table] SET [ActivityDate] = ''' + CONVERT(nvarchar(max), [DerivedTasksAndNotesTogetherAgain].[PostedDate]) + ''', [Activity] = ' + CONVERT(nvarchar(max), [DerivedTasksAndNotesTogetherAgain].[Activity]) + ' WHERE UserID = ' + CONVERT(nvarchar(max), [DerivedTasksAndNotesTogetherAgain].[UserID]) AS [TSQL]
FROM
(
SELECT
[UserID],
MAX([DerivedTasksAndNotesTogether].[PostedDate]) AS [MaxDate]
FROM
(
(
SELECT
--'Notes' AS [Source],
[Notes Table].[UserID],
[Notes Table].[PostedDate],
[Notes Table].[Activity]
FROM
[Notes Table]
)
UNION ALL
(
SELECT
--'Tasks' AS [Source],
[Tasks Table].[UserID],
[Tasks Table].[PostedDate],
[Tasks Table].[Activity]
FROM
[Tasks Table]
)
) DerivedTasksAndNotesTogether
GROUP BY
[UserID]
) DerivedMaxValues
LEFT OUTER JOIN
(
(
SELECT
--'Notes' AS [Source],
[Notes Table].[UserID],
[Notes Table].[PostedDate],
[Notes Table].[Activity]
FROM
[Notes Table]
)
UNION ALL
(
SELECT
--'Tasks' AS [Source],
[Tasks Table].[UserID],
[Tasks Table].[PostedDate],
[Tasks Table].[Activity]
FROM
[Tasks Table]
)
) DerivedTasksAndNotesTogetherAgain ON [DerivedMaxValues].[MaxDate] = DerivedTasksAndNotesTogetherAgain.[PostedDate]
现在,您可以复制/粘贴结果以执行,或者将此选择包装在游标中以自动执行。
虽然这应该按原样运作,但这里还有一些改进空间。首先,两次使用的大丑UNION
可能会变成CTE,只是为了减小尺寸。此外,我不是动态TSQL的一般忠实粉丝,并且在UPDATE
执行SELECT
这些表单上有一些向导 - 其中一个可能会出现并且能够消除为了你。