UNION со всеми именами полей и нулями, где имена не существуют - PullRequest
0 голосов
/ 22 октября 2019

Я возился с этим кодом, чтобы найти все имена таблиц со всеми нужными мне полями.

select t.name, c.name
from sys.columns c
join sys.tables t
on c.object_id = t.object_id
where c.name like '%ID%' 
     OR c.name like '%ID1%'
     OR c.name like '%ID2%'
     OR c.name like '%ID3%'
     OR c.name like '%ABC%'
     OR c.name like '%RTG%'
order by c.name

Я получаю пару сотен имен таблиц и имен полей. По сути, я пытаюсь найти самый простой способ получить мои результаты, например так:

select col1, col2, col3, null as col4 from table1
union all
select col1, col2, col3, null as col4 from table2
union all
select col1, col2, col3, col4 from table3;

Проблема здесь в том, что ... я могу напечатать логику, но я имею дело с сотнямитаблицы / поля, и это действительно трудно жестко закодировать всю эту логику. Я использую SQL Server Azure. Мысли? Идеи? Предложения

1 Ответ

2 голосов
/ 22 октября 2019

Я не знаю, действительно ли я рекомендую это, но вы можете использовать контекстный трюк, чтобы все подзапросы были в основном одинаковыми:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...