Я не знаю, действительно ли я рекомендую это, но вы можете использовать контекстный трюк, чтобы все подзапросы были в основном одинаковыми:
select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
(select a, b, c, d
from table1
) t
union all
select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
(select a, b, c, d
from table2
) t
. . .
По сути, подзапрос выберет значения из таблицы если они существуют . В противном случае он извлечет их из v
.
РЕДАКТИРОВАТЬ:
Или, как указывает Мартин:
select t.*
from (values (NULL, NULL, NULL, NULL)) v(a, b, c, d) cross apply
((select a, b, c, d from table1
) union all
(select a, b, c, d from table2
) union all
. . .
) t