Вы знаете, как выглядит оператор, поэтому просто создайте его, используя динамические операторы T-SQL и системные представления. Примерно так:
DECLARE @DataSource TABLE
(
[name] SYSNAME
,[table_alias] VARCHAR(12)
,[column_alias] VARCHAR(12)
);
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
DECLARE @BaseTableName SYSNAME
,@BaseTableAlias VARCHAR(12);
INSERT INTO @DataSource ([name], [table_alias], [column_alias])
SELECT [name]
,'T' + CAST(ROW_NUMBER() OVER (ORDER BY [name] ASC) AS VARCHAR(12))
,'revenue' + CAST(TRY_CAST(REPLACE([name], 'table', '') AS INT) AS VARCHAR(12))
FROM [sys].[tables]
WHERE [schema_id] = SCHEMA_ID('dbo')
AND TRY_CAST(REPLACE([name], 'table', '') AS INT) BETWEEN 1990 AND 2019;
SELECT @BaseTableName = [name]
,@BaseTableAlias = [table_alias]
FROM @DataSource
WHERE [name] <> 'table2018';
SET @DynamicTSQLStatement = 'SELECT ' + @BaseTableAlias + '.[Team]';
SELECT @DynamicTSQLStatement = @DynamicTSQLStatement + STUFF
(
(
SELECT ',' + [table_alias] + '.[Revenue ($M)] AS [' + [column_alias] + ']'
FROM @DataSource
ORDER BY [name]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,0
,''
);
SET @DynamicTSQLStatement = @DynamicTSQLStatement + ' FROM ' + @BaseTableName + ' ' + @BaseTableAlias + ' ';
SELECT @DynamicTSQLStatement = @DynamicTSQLStatement + STUFF
(
(
SELECT ' INNER JOIN [dbo].[' + [name] + '] AS ' + [table_alias] + ' ON ' + [table_alias] + '.[team] = ' + @BaseTableAlias + '.[Team]'
FROM @DataSource
WHERE [name] <> @BaseTableName
ORDER BY [name]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,0
,''
);
EXEC sp_executesql @DynamicTSQLStatement;
Я использую TRY_CAST
, чтобы получить только те таблицы, которые мне интересны, но если эта функция не поддерживается в вашем издании, вы можете изменить критерии фильтрации. Остальная часть кода должна работать на каждой редакции.