Упростите SQL-запрос в более короткий запрос - PullRequest
0 голосов
/ 02 мая 2019

Я пишу таблицу журнала, которая содержит сводку претензий.Таблица журнала регистрирует данные всякий раз, когда происходит загрузка.

Я написал следующий запрос 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 ]

1 голос
/ 02 мая 2019

Забросьте сессионный стол.Если вы хотите использовать отдельные развивающиеся наборы результатов, используйте вместо этого CTE (наборы данных не могут быть большими для этой опции).

Возможно, вы захотите добавить это на codereview.stackexchange.com.

0 голосов
/ 02 мая 2019

Ваш метод создания temp и последующего использования оператора 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)

и затем используйте объявленные переменные в вашем следующем действии.

Приведенный выше пример кода может содержать ошибки, но он просто показывает вам другой способ мышления и может привести вас к лучшему подходу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...