将多个列合并到一个表中

问题描述 投票:0回答:1

我有一个表,我想将其从网格表转换为 XYZ 绘图视图,以便我可以导入到应用程序中以创建数据的 3D 绘图。目前该表有 1 列用于序列 (X),一列用于日期 (Y),大约 520 列用于数据点 (Z)。我正在构建一个如下所示的 Union All 视图,但想知道是否有更简单、更有效的方法来做到这一点:

Select   seq as x
    ,t_stamp as y
    ,D_1 as z
From dbo.Table_3D_data
Union All
Select  seq as x
    ,t_stamp as y
    ,D_2 as z
From dbo.Table_3D_data
Union All   **......**  
Select   seq as x
    ,t_stamp as y
    ,D_520 as z
From dbo.Table_3D_data 
Order By seq

这将一直到 D_520 任何支持更轻松或更高效地构建这个简单查询的支持都会很棒

这会起作用,但需要一段时间才能写出查询,而且我仍在学习构建更好的查询。

sql sql-server t-sql
1个回答
0
投票

让我们将其分为两个部分,“更简单”和“更高效”。

  1. “更简单”:有些查询更容易输入,其他查询更容易维护或理解。其他人更容易使用低级别权限执行。

采用动态方法将减少代码行数,但代价是降低可理解性并需要更大的权限。

这将以更少的行数和更少的重复执行相同的查询:

declare 
    @n int = 1,
    @max int = 520,
    @sql nvarchar(max) = N'',
    @query nvarchar(max) = N'',
    @union nvarchar(max) = N'' + char(13) + N'Union All' + char(13)
while @n <= @max
begin
    set @sql = '
Select   seq as x
    ,t_stamp as y
    ,D_' + cast(@n as nvarchar(max)) + ' as z
From dbo.Table_3D_data
    '
    set @query = @query + @union
    set @n+=1
end

set @query = trim(substring(@query, 1, len(@query) - len(@union)))
exec(@query)

这是否适合您将取决于具体情况(见下文)。

  1. “更高效”:我无法在这方面发表太多评论,只是说,一般来说,这个动态示例的执行效率与最初发布的示例类似。运行连接查询字符串的 while 循环会产生少量开销,但这可以忽略不计。

如果您最终想要一个视图,而不是另一个对象,那么动态 sql 将不适合,因为视图定义中不允许变量声明和对 exec() 的调用。

如果您需要一个可重用的对象,那么将上述内容包装在存储过程中可能是一个好方法,并且可以防止潜在的性能问题,例如在将来的某个时刻将您的视图连接到另一个视图(嵌套视图的执行速度非常缓慢)。

您在评论中提到“我只能使用通过其他程序员或应用程序提供给我的表格和设计”,这表明您可能没有足够的权限来创建过程。这需要与您的管理员核实。

© www.soinside.com 2019 - 2024. All rights reserved.