将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

我正在写一个包含索赔摘要的日志表。每当上传数据时,日志表记录数据

我编写了以下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转换为较短版本。

放弃会话表。如果您想使用单独的演化结果集,请改用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。请把它寄到