如何将返回表名的子查询结果作为SELECT语句的表名使用
批量查询指定库中含指定列的表的最大更新时间
已知通过以下SQL可以获取testdatabase数据库中所有包含last_update列的表名:
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('last_update') AND TABLE_SCHEMA='testdatabase'
要对这些表逐个执行SELECT MAX(last_update) FROM [表名]并汇总结果,可以用动态SQL实现,以下是主流数据库的实现方式:
MySQL 实现
SET @sql = NULL; SELECT GROUP_CONCAT( CONCAT('SELECT ''', TABLE_NAME, ''' AS table_name, MAX(last_update) AS max_last_update FROM ', TABLE_NAME) SEPARATOR ' UNION ALL ' ) INTO @sql FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'last_update' AND TABLE_SCHEMA = 'testdatabase'; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
这段代码会自动拼接所有表的查询语句,通过UNION ALL合并结果,最终返回每个表的名称及其对应的最大last_update值。
SQL Server 实现
DECLARE @sql NVARCHAR(MAX); SELECT @sql = STRING_AGG( CONCAT('SELECT ''', TABLE_NAME, ''' AS table_name, MAX(last_update) AS max_last_update FROM ', QUOTENAME(TABLE_NAME)), ' UNION ALL ' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'last_update' AND TABLE_SCHEMA = 'testdatabase'; EXEC sp_executesql @sql;
使用STRING_AGG拼接查询语句,QUOTENAME处理表名中的特殊字符,确保语句执行安全。
内容的提问来源于stack exchange,提问作者CRoNiC
相关产品推荐
相关产品推荐

