You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求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

火山引擎 最新活动