SQL Server 如何编写包括select、joins和group by的更新查询

nx7onnlm  于 2022-11-28  发布在  其他
关注(0)|答案(1)|浏览(125)

我的数据库中有两个表:tweetsusers中的一个或多个。
users表中,我有三列,分别命名为“id“(用户ID)、“datetime_created_at“(用户添加到数据库的日期时间)和“datetime_modified_at“(用户属性修改的最后日期时间)。
tweets表中,我有两列:“id“(推文ID)和“datetime“(发布此推文的日期时间)。
users表中,我在datetime_modified_at列中为某些用户提供了NULL值,因此,为了填充它,我决定将用户发布的最后一条推文的日期时间(当该值为NULL时)填入该值,但datetime_created_at确实有一个非NULL值。例如,如果UserA有两条推文,分别为dateA和dateB,并且dateB〉dateA,我希望如下填充NULL值:datetime_modified_at =日期B。
为此,我编写了以下查询:

update users
set datetime_modified_at = max_datetime
from (
    select users.id, max(tweets.datetime) as max_datetime from users 
    inner join tweets on users.id = tweets.user_id
    where users.datetime_created_at is not NULL and users.datetime_modified_at is NULL
    group by users.id
)  Grouped
where users.datetime_created_at is not NULL and users.datetime_modified_at is NULL

此查询的问题是,符合此条件(where users.datetime_created_at is not NULL and users.datetime_modified_at is NULL)的每个用户的每个datetime_modified_at都填充了相同的值(例如“2022-08-03 22:22:42”,而不是每个用户的实际最大日期时间)。
我应该如何编写此查询以获得此结果?

ecbunoof

ecbunoof1#

试试这个。你应该更新where,先从用户表中选择,然后再内部连接表,这样它就可以更新到相应的id。

update users
set datetime_modified_at = max_datetime
from 
users INNER JOIN
(
    select users.id, max(tweets.datetime) as max_datetime from users 
    inner join tweets on users.id = tweets.user_id
    where users.datetime_created_at is not NULL and users.datetime_modified_at is NULL
    group by users.id
)  Grouped ON users.id = grouped.id
where users.datetime_created_at is not NULL and users.datetime_modified_at is NULL

相关问题