Как я могу получить максимальное значение столбца из каждой таблицы в нескольких схемах?

#mysql #sql #inner-join #union

#mysql #sql #внутреннее соединение #объединение

Вопрос:

Возможно ли получить максимальное значение одного столбца, которое существует в большинстве таблиц в нескольких разных схемах?

Если бы это была одна или две таблицы, я мог бы легко использовать:

 SELECT 'schema1.table1' as rowsource, category, max(date_used) max_date_used from schema1.table1 group by category
UNION ALL
SELECT 'schema1.table2' as rowsource, category, max(date_used) max_date_used from schema1.table2 group by category
UNION ALL
SELECT 'schema2.table3' as rowsource, category, max(date_used) max_date_used from schema2.table3 group by category
UNION ALL
SELECT 'schema3.table4' as rowsource, category, max(date_used) max_date_used from schema3.table4 group by category
 

Тем не менее, я рассматриваю возможность запроса почти 300 таблиц в 3 разных схемах.

TIA за любые советы / понимание!

Комментарии:

1. Создайте хранимую процедуру, которая выполняет итерацию по INFORMATION_SCHEMA.COLUMNS и выполняет эти запросы с использованием динамического SQL. PS. Вы не можете определить, из какой таблицы взята каждая строка вывода, поэтому запрос не имеет смысла. Добавьте еще один столбец, подобный SELECT ... , 'schemaX.tableY' as taken_from ... .

Ответ №1:

Вы можете попытаться сохранить всю необходимую таблицу из informationSchema во временную таблицу, а затем использовать динамический SQL для просмотра каждой из них. Например

 DROP TABLE IF EXISTS #Temp
CREATE TABLE #temp ---identity column will be used to iterate
(
id INT IDENTITY,
TableName VARCHAR(50),
SchemaName VARCHAR(20)
)

INSERT INTO #temp
SELECT TABLE_NAME,TABLE_SCHEMA
FROM INFORMATION_SCHEMA.TABLES
-- choose your own results with where conditions

DECLARE @SQL VARCHAR(MAX) = ''
DECLARE @Count INT = 1
DECLARE @SchemaName VARCHAR(20)
DECLARE @Table VARCHAR(20)

WHILE @COUNT <= (SELECT COUNT(*) FROM #temp) 
BEGIN
    SELECT @SchemaName = SchemaName FROM  #temp WHERE id = @Count
    SELECT @table = TABLENAME FROM #temp WHERE id = @Count

    SELECT @sql = @sql   'SELECT category, max(date_used) max_date_used from '   @SchemaName   '.'   @Table   ' group by category
                   UNION ALL '

SET @Count = @Count   1
END
PRINT LEFT((@SQL),LEN(@SQL) - LEN('UNION ALL ')) 
 

После проверки напечатанного результата измените его на EXEC, если вы считаете, что это правильно для вас.