我的任务是从数据库的所有表中获取前100行,并将它们合并为一个结果输出。 由于表具有不同的列数和类型,因此,我看到的唯一方法是将行号作为列,并将列名放在第一列中。所有表格的第1行将在第2列中表示,依此类推。
我在sql方面的技能不足以解决这一问题,因此我希望社区能够在这方面为我提供帮助。
以下是一些代码:
--Example table
create table Worker (Id int, FirstName nvarchar(max));
--Some data
insert into Worker values (1,'John'),(2,'Jane'),(3,'Elisa');
--Static pivot example
select * from (select
ROW_NUMBER() over (order by Id) as IdRows, FirstName from worker) as st
pivot
(
max(FirstName) for IdRows in ([1],[2],[3])
) as pt;
--Code to incorporate to get column name on column 1
select name from sys.columns where object_id('Worker') = object_id;
--Cleanup
drop table Worker;
我认为静态枢轴必须是动态的,这不是问题。上面的代码只是为了创建概念证明,因此我有一些基础。
查询的最终结果应如下:
Column 1 2 3
FirstName John Erina Jane
我希望可以在不使用游标和临时表的情况下解决此问题,但这也许是解决方法?
编辑: 忘记了,我正在使用sqlserver(mssql)
EDIT2: 我不太擅长解释,因此这里有更多代码可以帮助我完成这项工作。 这会将另一列添加到Worker表中,并添加一个查询以显示所需的结果。该查询必须“更智能”,以便可以处理将来添加的表和添加的列。 (再次,这是一个概念证明。该数据库具有> 200个表和> 1000列)
--Add a column
alter table Worker add LastName nvarchar(max);
--Add some data
update Worker set LastName = 'Smith' where Id = 1;
update Worker set LastName = 'Smith' where Id = 2;
update Worker set LastName = 'Smith' where Id = 3;
--Query to give desired output (top 100, but only 3 rows in this table)
select 'FirstName' as 'Column',* from (select top 100
ROW_NUMBER() over (order by Id) as IdRows, FirstName from worker) as st
pivot
(
max(FirstName) for IdRows in ([1],[2],[3])
) as pt
union
select 'LastName' as 'Column',* from (select top 100
ROW_NUMBER() over (order by Id) as IdRows, LastName from worker) as st
pivot
(
max(LastName) for IdRows in ([1],[2],[3])
) as pt
答案 0 :(得分:0)
为解决此问题,我使用了临时表,并将其放入循环中。这不是一个好的解决方案,但它可以工作。必须将所有数据转换为nvarchar才能使其正常工作。