Здесь #tmporigin
относится к вашему исходному запросу, который производит данные в вопросе. Просто замените имя таблицы на подзапрос.
insert into resulttable
select
o.id,
case a.n when 1 then b1 when 2 then b2 else b3 end,
case a.n when 1 then c when 2 then e else g end
from #tmporigin o
cross join (select 1n union all select 2 union all select 3) a
Оригинальный ответ ниже, с использованием CTE и объединения, требующего оценки CTE 3 раза
У меня следующий вывод из нескольких таблиц
Так что установите этот запрос как общее табличное выражение
;WITH CTE AS (
-- the query that produces that output
)
select id,b1,c from CTE
union all
select id,b2,e from CTE
union all
select id,b3,g from CTE
ПРИМЕЧАНИЕ - Вопреки распространенному мнению, ваш CTE, хотя и написан удобно один раз, запускается трижды в приведенном выше запросе, один раз для каждой из всех частей объединения.
ПРИМЕЧАНИЕ ТАКЖЕ , что если вы на самом деле назовете 3 столбца "b" (буквально), то нет способа определить, на какой b
вы ссылаетесь во всем, что пытается ссылаться на результаты - фактически SQL Server не позволит вам использовать запрос в CTE или подзапросе.
В следующем примере показано, как выполнить вышеизложенное, а также (если вы показываете план выполнения), показывающее, что CTE запускается 3 раза! (строки между --- BELOW HERE
и --- ABOVE HERE
- это макет original query
, который выдает результат в вопросе.
if object_id('tempdb..#eav') is not null drop table #eav
;
create table #eav (id char(3), b int, v int)
insert #eav select 'abc', 2, 123
insert #eav select 'abc', 3, 321
insert #eav select 'abc', 7, 876
insert #eav select 'abd', 2, 456
insert #eav select 'abd', 3, 452
insert #eav select 'abd', 7, 234
insert #eav select 'abe', 2, 0
insert #eav select 'abe', 3, 123
insert #eav select 'abe', 7, 121
insert #eav select 'abf', 3, 535
insert #eav select 'abf', 7, 1212
;with cte as (
---- BELOW HERE
select id.id, b1, b1.v c, b2, b2.v e, b3, b3.v g
from
(select distinct id, 2 as b1, 3 as b2, 7 as b3 from #eav) id
left join #eav b1 on b1.b=id.b1 and b1.id=id.id
left join #eav b2 on b2.b=id.b2 and b2.id=id.id
left join #eav b3 on b3.b=id.b3 and b3.id=id.id
---- ABOVE HERE
)
select b1, c from cte
union all
select b2, e from cte
union all
select b3, g from cte
order by b1
Было бы лучше сохранить данные во временную таблицу, прежде чем делать выбор union all
.