水平联合选择语句

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

Tar*_*ryn 7

怎么样,如果您需要它们在同一行中,这会获取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)

请参阅SQL Fiddle 演示

如果您不需要将它们放在同一行,请使用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)

请参阅SQL Fiddle 演示

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)

请参阅SQL Fiddle 演示


Jim*_*Jim 5

这会为你做到这一点:

SELECT
ID, field1, field2, '' as field3, '' as field4
FROM sometable

UNION ALL

SELECT
ID, '', '', field3, field4
FROM someothertable
Run Code Online (Sandbox Code Playgroud)