【发布时间】:2017-08-16 16:44:56
【问题描述】:
我有这个查询,它连接回一个表以根据某些标准计算分数。在某些情况下,目标表中不存在需要返回某些内容的行,因此我在下面有当前查询,它会降低性能并且有时不会返回,因为此特定查询是 SSRS 中较大的查询评分集中的子查询和 SQL Server。
SELECT
G.[Name],
G.[ID],
A.IName,
A.ItID,
COUNT(A.IHid) OVER() AS ICount,
G.[AllComplete],
G.[IComplete],
G.[IStatus],
A.[Group],
A.[Status] AS [Status],
A.[Type] AS [Type]
FROM TableA A
INNER JOIN TableG G
ON A.ID = G.ID AND G.id IS Not NULL
WHERE G.[ID] = ('048')
AND NOT ( A.ItID = '' )
AND NOT ( A.[Status] IN ('NA'))
UNION ALL
SELECT 'N/A', 'N/A', 'N/A', 'N/A', 0, NULL, NULL, 'N/A', 'N/A', 'N/A', 'N/A'
WHERE NOT EXISTS (SELECT 1
FROM TableA A
INNER JOIN TableG G
ON A.ID = G.ID AND G.id IS Not NULL
WHERE G.[ID] = ('048')
AND NOT ( A.ItID = '' )
AND NOT ( A.[Status] IN ('NA')))
【问题讨论】:
-
这整件事是一个子查询?你怎么知道这是影响性能的部分?您可以在主查询之前将此作为 cte 吗?在没有上下文的情况下很难在这里提供很多帮助。
-
通常,“某些行不存在”会暗示
LEFT JOIN,但这里不清楚哪些数据始终存在(如果有的话)。特别是如果这是子查询的一部分,通常您只返回空集(无行),而不是虚拟行。 -
您的第一个 UNION 有一个 WHERE 子句,这与您的第二个 UNION 相同,但不存在?愿意给我们一个关于你在这里想要实现的目标的背景吗?您是否只想为不在您的第一个 UNION 中的 ID 设置一行“N/A”?如果是这种情况,则不需要您的第二个 UNION。
-
整个查询的这一部分获取结果并将其用于评分。
-
N/A 如何用于评分?
标签: sql sql-server reporting-services ssrs-2012