求SQL Server两表左连接查询语句,按Table_Log更新时间倒序排序
没问题,我来帮你搞定这个SQL查询需求。你需要的是左连接主注册表和日志表,让有更新记录的条目优先展示,同时按最新的更新时间倒序排列对吧?
思路说明
首先,Table_Log里同一个RegId可能有多条更新记录,我们得先拿到每个用户的最新更新时间,避免一条主表记录对应多条日志记录的冗余情况。然后用主表左连接这个聚合后的日志数据,最后通过排序规则让有更新记录的条目靠前,再按更新时间倒序排列。
具体SQL语句
方案1:获取每个用户最新更新记录(推荐)
这个方案会给每个主表记录匹配其最近一次的更新时间,结果更简洁:
WITH LatestLog AS ( -- 先聚合出每个RegId的最新更新时间 SELECT RegId, MAX(updatedDate) AS latestUpdatedDate FROM Table_Log GROUP BY RegId ) SELECT r.RegId, r.Name, r.Email, r.SubDate, ll.latestUpdatedDate FROM Table_Registration r LEFT JOIN LatestLog ll ON r.RegId = ll.RegId ORDER BY -- 有更新记录的优先展示(0排在1前面) CASE WHEN ll.latestUpdatedDate IS NOT NULL THEN 0 ELSE 1 END, -- 按最新更新时间倒序,无更新的按主表注册时间倒序 ISNULL(ll.latestUpdatedDate, r.SubDate) DESC;
方案2:保留所有日志记录(若需展示全部更新历史)
如果需要保留每条日志记录对应的主表数据(会出现主表记录重复),可以用这个写法:
SELECT r.RegId, -- 优先取日志表的Name,不存在则用主表Name(如果两者可能不一致的话) COALESCE(l.Name, r.Name) AS Name, r.Email, r.SubDate, l.updatedDate FROM Table_Registration r LEFT JOIN Table_Log l ON r.RegId = l.RegId ORDER BY -- 有更新记录的优先展示 CASE WHEN l.updatedDate IS NOT NULL THEN 0 ELSE 1 END, -- 按更新时间倒序 l.updatedDate DESC;
排序逻辑解释
CASE WHEN ll.latestUpdatedDate IS NOT NULL THEN 0 ELSE 1 END:通过给有更新记录的条目标记0,无更新的标记1,确保有更新的内容排在最前面。ISNULL(ll.latestUpdatedDate, r.SubDate) DESC:优先按最新更新时间倒序,没有更新记录的则按主表的注册时间倒序排列。
内容的提问来源于stack exchange,提问作者mazhar




