将SQL查询简化为较短的查询

时间:2019-05-02 16:20:10

标签: sql sql-server

我正在写一个日志表,其中包含索赔摘要。只要有上传,日志表就会记录数据。

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

2 个答案:

答案 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)

,然后在下一个操作中使用声明的变量。

上面的代码示例可能包含错误,但这只是为了向您展示另一种思维方式,并且可能使您找到更好的方法。