首页 > 解决方案 > 如何将动态查询列写入 SQL Server 中的行?

问题描述

我在 SQL Server 中有一个问题:如何在查询中将 4 列合并为 1 列。

桌子:emp

empid | addr | sal | doj
------+------+-----+------------
  1   | hyd  | 10  | 10-01-1990
  2   | del  | 20  | 12-03-1999
  1   | pune | 50  | 12-03-2017

基于上述数据,我想要如下输出

empid | empvalues
------+---------------
1     | hyd
1     | 10
1     | 10-01-1990
2     | del
2     | 20
2     | 12-03-1999
1     | pune
1     | 50
1     | 12-03-2017

我试过这样的查询:

select 
    empid, cast (addr as varchar(100)) as empvalues 
from emp

union all

select empid, cast (sal as varchar(100)) as empvalues 
from emp

union all

select empid, cast (doj as varchar(100)) as empvalues 
from emp

此查询返回正确的结果,但由于调用同一个表 3 次,它需要很多时间。

您能告诉我如何编写任何替代查询来在 SQL Server 中完成此任务吗?

标签: sql-serversql-server-2012

解决方案


使用交叉应用

create table emp (empid int, addr varchar(10), sal int, doj datetime) 

insert into emp (empid, addr, sal, doj)
values (1, 'hyd', '10', '10-01-1990'),
  (2, 'del', '20', '12-03-1999'),
  (1, 'pune', '50', '12-03-2017'); 


select empid,empvalues from emp
cross apply (values (cast (addr as varchar(10)))
,(cast (sal as varchar(10)))  
,(Format(doj,'MM-dd-yyyy')))   d(empvalues) 

结果:

empid   empvalues
1   hyd
1   10
1   10-01-1990
2   del
2   20
2   12-03-1999
1   pune
1   50
1   12-03-2017 

更多信息请查看以下文章:

docs.microsoftSQL Server 交叉应用和外部应用


推荐阅读