我正在写一个日志表,其中包含索赔摘要。只要有上传,日志表就会记录数据。
我编写了以下sql查询。尽管它达到了目的,但我正在尝试了解是否有任何方法可以简化以下更新。
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转换为较短的版本。
答案 0 :(得分:1)
放弃会话表。如果要使用单独的演化结果集,请改用CTE(此选项的数据集不能太大)。
您可能希望将此代码放入codereview.stackexchange.com。
答案 1 :(得分:0)
您创建临时文件,然后仅使用UPDATE语句更新每一列的方法会破坏查询性能,您会在较大的表中注意到这一点。即使您使用的是临时表,也并不意味着这样做会使其更快。
有很多方法可以轻松获得所需的输出。例如,您可以在JOIN的帮助下使用聚合函数在一个查询中获得相同的结果。
对于我来说,我可以看到您的输出将是一行,其中包含总索偿,总插入,总错误以及错误索偿编号列表。因此,我假设每次该过程运行时输出始终为一行。
在这种情况下,您可以使用变量,就像这样:
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)
,然后在下一个操作中使用声明的变量。
上面的代码示例可能包含错误,但这只是为了向您展示另一种思维方式,并且可能使您找到更好的方法。