#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, если вы считаете, что это правильно для вас.