寻找更好的方法在同一行中显示列值

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

我有一个 SQL 视图:

DECLARE @StartDate date = '5/1/2024'
DECLARE @EndDate date = '5/31/2024'
SELECT DISTINCT
    i.IncidentNumber
    , i.ReportNumber
FROM MV_Incident AS i WITH (nolock)
WHERE i.IncidentDate BETWEEN @StartDate AND dateadd(d, 1, @EndDate) 
order by i.IncidentNumber

...返回这样的数据:

Original results

但我希望每一行都有一个唯一的第一列值,并且第二列中的任何多个值都显示在第三列中(或者第四列或第五列,如果有那么多)。

Preferred results

现在,如果我使用子查询,我就可以让它工作:

SELECT DISTINCT
    i.IncidentNumber
    , (SELECT i2.ReportNumber FROM MV_Incident AS i2 WITH (nolock) WHERE i2.IncidentNumber = i.IncidentNumber 
        ORDER BY i2.ReportNumber offset 0 rows FETCH next 1 row ONLY) AS ReportNumber1
    , (SELECT i2.ReportNumber FROM MV_Incident AS i2 WITH (nolock) WHERE i2.IncidentNumber = i.IncidentNumber
        ORDER BY i2.ReportNumber offset 1 rows FETCH next 1 row ONLY) AS ReportNumber2

...但是运行速度非常慢。有更好的方法可以实现这一点吗?

非常感谢任何可以提供帮助的人。

sql performance t-sql optimization fetch
1个回答
0
投票

SQL 语言有一个严格的规则:在查看任何数据之前,您必须在查询编译时知道结果集中的列数。当您可以拥有这样的动态列时,它就违反了该规则。您有两种选择来解决它:

  1. 选择合理的最大列数,并根据该最大列数构建查询。
  2. 分三个步骤运行查询:首先运行查询以确定您需要多少列。然后使用该结果动态构建新查询。最后,运行生成的查询。

这两个选项都写起来很痛苦并且执行速度很慢,因为这个要求违反了支撑所有 SQL 数据库的关系集合理论。考虑到这一点,在客户端代码或报告工具中进行此转换通常会获得更好的结果。

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