Обновите поле, проверив комбинацию параметров - PullRequest
0 голосов
/ 23 января 2020

Я хотел бы сделать SQL Dynami c SQL оператор обновления, где я проверю все комбинации между двумя полями, как ...

MS | TO или MS | 1

... и обновить произведенные. Я могу выбрать все комбинации из другой таблицы. Как я могу сделать динамическое предложение c CASE с КОГДАМИ для каждой комбинации.

UPDATE dbo.KonfigTableOne
   SET P01Dec =  ( CASE  
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = '*|*')  THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = '*|*') 
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'MS|*') THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = 'MS|*') 
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'ME|*') THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = 'ME|*') 
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = '*|1')  THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = '*|1') 
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = '*|2')  THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = '*|2') 
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'MS|1') THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = 'MS|1') 
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'MS|2') THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = 'MS|2') 
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'ME|1') THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = 'ME|1') 
                   WHEN (Ap.Ke01 + '|' + Ap.Ke02 = 'ME|2') THEN (SELECT FACTOR FROM Factor  WHERE SHORTCUT = 'ME|2') 
                   END )
  FROM dbo.KonfigTableOne AS Ap CROSS JOIN
       dbo.KonfigTableTwo AS Ep
 WHERE (Ap.P02Dec = 1)

1 Ответ

1 голос
/ 23 января 2020

Ваш запрос может быть упрощен до:

UPDATE ap
    SET P01Dec = (SELECT FACTOR FROM Factor  WHERE SHORTCUT = Ap.Ke01 + '|' + Ap.Ke02) 
    FROM dbo.KonfigTableOne Ap CROSS JOIN
         dbo.KonfigTableTwo Ep
    WHERE Ap.P02Dec = 1 AND
          Ap.Ke01 + '|' + Ap.Ke02 IN ( . . . )  -- valid options here;

Я не вижу роли для динамического c SQL здесь.

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

Я бы порекомендовал вам задать НОВЫЙ вопрос. Предоставьте пример данных, желаемых результатов и объяснение того, что вы пытаетесь достичь sh.

...