ЗАПРОС НА ОБНОВЛЕНИЕ, УХОДЯЩИЙ ВРЕМЯ - PullRequest
0 голосов
/ 05 мая 2020

ЗАПРОС НА ОБНОВЛЕНИЕ, ЗНАЮЩИЙ БОЛЬШЕ ВРЕМЕНИ. ЕСТЬ ЛИ ДРУГОЙ СПОСОБ ЗАПИСАТЬ ПОД ЗАПРОСОМ БЕЗ ТОП 1? НРАВИТСЯ ИСПОЛЬЗОВАТЬ ФУНКЦИИ РАНГА ИЛИ СТРОКИ?

SELECT proddiv, 
       prodstl, 
       prodcode, 
       lablcode, 
       proddim, 
       proddiv       AS PRD_DIV, 
       prodstl       AS PRD_PRODSTL, 
       prodcode      AS PRDCOLOR, 
       label_code    AS PRDlbl, 
       proddim       AS par_dim, 
       0             AS low_level, 
       0             AS smuh_pkey, 
       IDENTITY(int) AS prdkey, 
       list_price 
INTO   #brandsdata 
FROM   products WITH (nolock) 

DECLARE @Max INT = 30, 
        @x   INT = 0 

WHILE ( @x < 30 ) 
  BEGIN 
      UPDATE t 
      SET    smuh_pkey = (SELECT TOP 1 prdkey 
                          FROM   customers WITH (nolock) 
                          WHERE  ( proddiv = '' 
                                    OR proddiv = t.proddiv ) 
                                 AND ( prodstl = '' 
                                        OR prodstl = t.prodstl ) 
                                 AND ( prodcode = '' 
                                        OR prodcode = t.prodcode ) 
                                 AND ( lablcode = '' 
                                        OR lablcode = t.lablcode ) 
                                 AND ( proddim = '' 
                                        OR proddim = t.proddim ) 
                                 AND prod_type = '' 
                                 AND active_ok = 'Y' 
                          ORDER  BY brand_name, 
                                    brand_type DESC) 
      FROM   #brandsdata t 
      WHERE  smuh_pkey = 0 
             AND low_level = @x 

      SET @x = @x + 1 
  END 

ЗАРАНЕЕ СПАСИБО.

1 Ответ

0 голосов
/ 05 мая 2020

Попробуйте что-нибудь вроде этого.

;with c as (
    select c.prdKey, c.proddiv, c.prodstl, c.prodcode, c.lablcode, c.proddim, 
        ROW_NUMBER() over (
            partition by c.proddiv, c.prodstl, c.prodcode, c.lablcode, c.proddim 
        order by c.brand_name, c.brand_type DESC) rn
     from customers c
     where prod_type = '' and  
     active_ok = 'Y' 
)
update t
set smuh_pkey = c.prdKey
from #brandsdata t 
inner join c 
    on      ( c.proddiv  = '' OR c.proddiv  = t.proddiv ) 
        AND ( c.prodstl  = '' OR c.prodstl  = t.prodstl ) 
        AND ( c.prodcode = '' OR c.prodcode = t.prodcode ) 
        AND ( c.lablcode = '' OR c.lablcode = t.lablcode ) 
        AND ( c.proddim  = '' OR c.proddim  = t.proddim ) 
where c.rn = 1  

Я думаю, что этого будет недостаточно для 100% случаев, потому что, если у вас может быть несколько комбинаций пустой строки с непустой, вы можете получить разные результаты. тогда вы можете настроить

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