首页 > 解决方案 > SQL Server - 在上次编辑日期最近的多个联接表中选择一个常用命名列

问题描述

我们县最近购买了一个新的房地产系统。我创建了一个连接十几个表的视图。(评估、纳税人、收款等...)

每个表都有一个上次更改数据和上次更改用户字段。

我们想知道包裹号码在系统中最后一次更改的时间以及是什么登录名进行了这些更改。

通过使用以下嵌套查询,我能够提取最新的更改数据...

SELECT 
    ... ,
    (SELECT MAX(v) 
     FROM (VALUES (table1.last_chg_datetime), (table2.last_chg_datetime), 
                  (table3.last_chg_datetime), (table4.last_chg_datetime), ... , 
                  (tableN.last_chg_datetime)) AS value(v)) AS last_chg_datetime 
FROM table1 
LEFT OUTER JOIN table2 ...

从与最后更改日期对应的表中提取最后更改的用户的最佳方法是什么?

我确信这可以通过存储过程来完成。我只是想知道这是否也可以通过更改嵌套查询来提取?

我们正在运行 SQL Server 2016。

标签: sql-server

解决方案


查询可以重写为:

SELECT  ... ,sub. *
FROM table1 
LEFT OUTER JOIN table2 ...
OUTER APPLY (SELECT TOP 1 * 
     FROM (VALUES (table1.last_chg_datetime, table1.user), (table2.last_chg_datetime, table2.user), 
                  (table3.last_chg_datetime, table3.user), (table4.last_chg_datetime, table4.user), ... , 
                  (tableN.last_chg_datetime, tableN.user)) AS value(v, user_name)
    ORDER BY v DESC
   ) sub;

它也可以通过表名扩展:

(VALUES ('table1', table1.last_chg_datetime, table1.user), 
        ('table2', table2.last_chg_datetime, table2.user), ...
) AS value(table_name, v, user_name)

推荐阅读