sql-server - 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。
解决方案
查询可以重写为:
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)
推荐阅读
- mysql - SQL - 如何找到包含时间戳的同一列的两行之间的差异
- java - 为什么 driver.findElement 在 safari 12.2 中导致 java.lang.nullpointerexception null
- java - GridPane JavaFX8 中未出现按钮
- spring-cloud-stream - 使用 Spring Cloud Stream 从 SFTP 读取文件
- arrays - 在 Bash 中返回给定宽度的文本段落所需的行数
- typescript - SVG.js:检测“元素”是否为“组”
- java - “set”方法中的“if”条件不起作用
- java - 如何将 JCheckBoxMenuItem 链接到由复选框控制的 JInternalFrames
- c - 在什么情况下,我们可以更改 c 中字符串的内容?
- ms-access - 如何根据字段值从另一个数据库预填充表单