sql - 水平联合选择语句

标签 sql sql-server sql-server-2008-r2

假设我的选择语句的结果如下(我有 5 个):

   Id  Animal AnimalId
    1   Dog     Dog1
    1   Cat     Cat57

   Id  Transport TransportId
    2   Car        Car100
    2   Plane      Plane500

我想得到如下结果:

   Id  Animal AnimalId    Transport    TransportId
    1   Dog     Dog1
    1   Cat     Cat57
    2                        Car          Car100
    2                       Plane         Plane500 

我可以做的是创建一个表变量并指定所有可能的列并将每个选择语句中的记录插入其中。但也许像 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

SQL Fiddle with Demo

如果你不需要它们在同一行,那么使用 UNION ALL:

select id, aname, aid, 'Animal' tbl
from animal
union all
select id, tname, tid, 'Transport'
from transport

SQL Fiddle with Demo

编辑 #1,这是一个带有 UNPIVOTPIVOT 的版本:

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

SQL Fiddle with Demo

关于sql - 水平联合选择语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12395761/

相关文章:

c# - JQGrid 高级搜索 - 我们可以同时使用 "AND"和 "OR"运算符吗?

c# - Entity Framework - SQL Server 2005 - IIS 服务器日期时间问题

sql-server-2008-r2 - 字母数字值之间的 SQL

mysql - 如何获得一列的总和?

mysql - 添加拒绝原因的 SQL 脚本

sql-server - SQL Server 2008 R2 上的 SET IDENTITY_INSERT 出现奇怪错误(消息 8107)

sql-server - 类似于 MySQL 的 DATE_SUB/INTERVAL

sql-server - 什么时候分配空间

sql-server-2008-r2 - SQL Server 2008 中针对动态列的算术运算符

sql - 使用 SQL 查询 XML 数据列