将SQL查询简化为较短的查询
我正在写一个包含索赔摘要的日志表。每当上传数据时,日志表记录数据 我编写了以下sql查询。虽然它可以达到这个目的,但我正在尝试了解是否有任何方法可以简化下面的更新将SQL查询简化为较短的查询,sql,sql-server,Sql,Sql Server,我正在写一个包含索赔摘要的日志表。每当上传数据时,日志表记录数据 我编写了以下sql查询。虽然它可以达到这个目的,但我正在尝试了解是否有任何方法可以简化下面的更新 CREATE TABLE #1 ( id INT IDENTITY(1, 1), [total no claims] INT, [total claims inserted] INT, [total claim
CREATE TABLE #1
(
id INT IDENTITY(1, 1),
[total no claims] INT,
[total claims inserted] INT,
[total claims errored out] INT,
[erroed claims] VARCHAR(max)
)
INSERT INTO #1
([total no claims])
SELECT Count(DISTINCT [claimnumber])
FROM [Operations Productivity Tool].[dbo].[test_importedauditdata] ta
WHERE claimnumber IN (SELECT DISTINCT claimnumber
FROM [dbo].[opcod audit information] ts
WHERE [final status] IN ( 'Finding', 'No Finding' ))
AND id = Scope_identity()
UPDATE #1
SET [total claims inserted] = (SELECT Count(DISTINCT [claimnumber])
FROM
[Operations Productivity Tool].[dbo].[test_importedauditdata] ta
WHERE claimnumber NOT IN
(SELECT DISTINCT claimnumber
FROM [dbo].[opcod audit information]
ts
WHERE [final status] IN (
'Finding', 'No Finding' )
))
WHERE id = Scope_identity()
UPDATE #1
SET [total claims errored out] = (SELECT
[total no claims] - [total claims inserted]
FROM #1)
WHERE id = Scope_identity()
UPDATE #1
SET [erroed claims] = (SELECT
Stuff ((SELECT DISTINCT ',' + claimnumber
FROM
[Operations Productivity Tool].[dbo].[test_importedauditdata]
WHERE claimnumber NOT IN
(SELECT DISTINCT claimnumber
FROM [dbo].[opcod audit information] ts
WHERE [final status] NOT IN (
'Finding', 'No Finding' ))
FOR xml
path(''), type).value('text()[1]', 'varchar(max)'), 1, 2, ''))
WHERE id = Scope_identity()
是否有任何方法将上述sql转换为较短版本。放弃会话表。如果您想使用单独的演化结果集,请改用CTE(此选项的数据集不会很大)
您可能想在codereview.stackexchange.com上发布此消息。您创建一个临时值然后只使用UPDATE语句更新每一列的方法会降低查询性能,您会注意到在较大的表中。即使您使用的是临时表,也不意味着这将使它更快 有许多方法可以用最少的努力获得所需的输出。例如,您可以在连接的帮助下使用聚合函数在一个查询中获得相同的结果 至于我,我可以看到你的输出将是一个单一的索赔总额,总插入,总错误,和错误的索赔编号列表行。因此,我假设每次过程运行时,输出总是一行 在这种情况下,可以使用变量,如下所示:
DECLARE
@Total INT
, @TotalInserted INT
, @TotalErroredOut INT
, @ErroredClaims NVARCHAR(MAX);
SELECT
@Total = SUM(CASE WHEN ta.[claimnumber] IN (d.claimnumber) THEN 1 ELSE 0 END)
, @TotalInserted = SUM(CASE WHEN ta.[claimnumber] NOT IN (d.claimnumber) THEN 1 ELSE 0 END)
, @TotalErroredOut = SUM(CASE WHEN ta.[claimnumber] IN (d.claimnumber) THEN 1 ELSE 0 END) - SUM(CASE WHEN ta.[claimnumber] NOT IN (d.claimnumber) THEN 1 ELSE 0 END)
, @ErroredClaims = COALESCE(@col + ',', '') + CASE WHEN ta.[claimnumber] NOT IN (d.claimnumber) THEN ta.[claimnumber] ELSE '' END
FROM
[Operations Productivity Tool].[dbo].[test_importedauditdata] ta
OUTER APPLY (
SELECT DISTINCT claimnumber
FROM [dbo].[opcod audit information] ts
WHERE
[final status] NOT IN ('Finding', 'No Finding')
) d
WHERE
claimnumber IN (d.claimnumber)
然后,在下一个操作中使用声明的变量
上面的代码示例可能包含错误,但它只是向您展示另一种思维方式,可能会引导您找到更好的方法。例如,如果您只需要变量,您可以不使用表。为什么不使用
;使用cte
语句。您不需要临时表。此外,你只需要重新思考你的逻辑。您的2个更新与where子句不同。此问题不适用于StackOverflow。请把它寄到