use*_*076 3 sql sql-server sql-server-2008-r2
假设我的 select 语句的结果如下(我有 5 个):
Id Animal AnimalId
1 Dog Dog1
1 Cat Cat57
Id Transport TransportId
2 Car Car100
2 Plane Plane500
Run Code Online (Sandbox Code Playgroud)
我想得到如下结果:
Id Animal AnimalId Transport TransportId
1 Dog Dog1
1 Cat Cat57
2 Car Car100
2 Plane Plane500
Run Code Online (Sandbox Code Playgroud)
我能做的是创建一个表变量并指定所有可能的列并将每个 select 语句中的记录插入其中。但也许像 PIVOT 这样更好的解决方案?
编辑
查询: 第一:Select CategoryId as Id, Animal, AnimalId from Animal
第二:Select CategoryId as Id, Transport, TransportId from Transport
怎么样,如果您需要它们在同一行中,这会获取row_number()每行的 并连接这些行:
select a.id,
a.aname,
a.aid,
t.tname,
t.tid
from
(
select id, aname, aid, row_number() over(order by aid) rn
from animal
) a
left join
(
select id, tname, tid, row_number() over(order by tid) rn
from transport
) t
on a.rn = t.rn
Run Code Online (Sandbox Code Playgroud)
如果您不需要将它们放在同一行,请使用UNION ALL:
select id, aname, aid, 'Animal' tbl
from animal
union all
select id, tname, tid, 'Transport'
from transport
Run Code Online (Sandbox Code Playgroud)
UNPIVOT编辑#1,这是一个带有and的版本PIVOT:
select an_id, [aname], [aid], [tname], [tid]
from
(
select *, row_number() over(partition by col order by col) rn
from animal
unpivot
(
value
for col in (aname, aid)
) u
union all
select *, row_number() over(partition by col order by col) rn
from transport
unpivot
(
value
for col in (tname, tid)
) u
) x1
pivot
(
min(value)
for col in([aname], [aid], [tname], [tid])
) p
order by an_id
Run Code Online (Sandbox Code Playgroud)
这会为你做到这一点:
SELECT
ID, field1, field2, '' as field3, '' as field4
FROM sometable
UNION ALL
SELECT
ID, '', '', field3, field4
FROM someothertable
Run Code Online (Sandbox Code Playgroud)