Вы можете использовать следующее с помощью UNION ALL
:
SELECT a, b, c, NULL AS d, NULL AS k FROM table1_test
UNION ALL
SELECT a, NULL, NULL, d, k FROM table2_test
Вы также можете использовать FULL OUTER JOIN
с условием ложного совпадения (1 = 2
):
SELECT COALESCE(t1.a, t2.a) AS a, t1.b, t1.c, t2.d, t2.k
FROM Table1_test t1 FULL OUTER JOIN Table2_test t2 ON 1 = 2
Вы также можете сгенерировать приведенный выше запрос SQL (если столбцов много или вы не хотите самостоятельно выбирать общие / необычные имена столбцов):
DECLARE @sql VARCHAR(MAX) = 'SELECT ' + (
SELECT STUFF((SELECT ',' + + col FROM (
SELECT CASE WHEN i1.t IS NOT NULL AND i2.t IS NOT NULL THEN 'COALESCE(' + i1.t + '.' + i1.COLUMN_NAME + ', ' + i2.t + '.' + i2.COLUMN_NAME + ') AS ' + i1.COLUMN_NAME ELSE COALESCE(i1.COLUMN_NAME, i2.COLUMN_NAME) END AS col, COALESCE(i1.COLUMN_NAME, i2.COLUMN_NAME) cname FROM (
SELECT 't1' AS t, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table1_test'
) i1 FULL OUTER JOIN (
SELECT 't2' AS t, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table2_test'
) i2 ON i1.COLUMN_NAME = i2.COLUMN_NAME
) cols ORDER BY cname FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
) + ' FROM Table1_test t1 FULL OUTER JOIN Table2_test t2 ON 1 = 2'
EXECUTE(@sql)
Вы можете поместить вышеуказанный скрипт в хранимую процедуру с двумя параметрами, чтобы сделать скрипт более гибким. Вы можете найти пример хранимой процедуры в демоверсии.
демо на dbfiddle.uk