在其他表中基于MAX(Date)更新多行

时间:2015-10-09 15:50:45

标签: tsql sql-server-2012

所以我的方案......我需要在ActivityDate表中更新2列ActivityUser。日期需要从其他两个表格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万行这样的东西?

1 个答案:

答案 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这些表单上有一些向导 - 其中一个可能会出现并且能够消除为了你。