Как обновить столбец из таблицы на основе значения другого столбца из другой таблицы - PullRequest
1 голос
/ 31 марта 2019

У меня есть table A, с двумя основными столбцами: Name и Settings.Столбец Settings будет иметь 3 значения: 1, 2 или 3.

Например:

таблица A :

Name     Settings
Andre        1
Andre        1
Betty        3
Charles      1
Charles      1

Примечаниечто 1 Name может иметь только 1 Settings: 1, 2 или 3 .

У меня есть еще table B, с двумя основными столбцами: Name и Type,Столбец Type состоит из множества значений, таких как: 'TypeA', 'TypeB', 'TypeC' ......

Например:

таблица B :

Name       Type
Andre      TypeA
Andre      TypeA
Andre      TypeC
Betty      TypeB
Betty      TypeB
Betty      TypeD
Charles    TypeB
Charles    TypeA
Charles    TypeA
.....

Обратите внимание, что 1 Name может иметь несколько одинаковых или не одинаковых Type. И мы только рассматриваем TypeA и TypeB.

Теперь я хочу обновить столбец Settings с table A, используя столбец 'Type' с table B, если:

  • Столбец Type из table B имеет значение 'TypeA', затем обновите все записи, имеющие одинаковые Name из обеих таблиц, до1 в столбце Settings из table A.
  • Столбец Type из table B имеет значение 'TypeB', затем обновите все записи, имеющие тот же Nameиз обеих таблиц до 2 в столбце Settings из table A.
  • Столбец Type из table B имеет оба значения 'TypeA' и 'TypeB', затем обновите всезаписи, имеющие одинаковые Name из обеих таблиц, равные 3 в столбце Settings из table A.

Результат из table A должен выглядеть следующим образом:

Name     Settings
Andre        1
Andre        1
Andre        1
Betty        2
Charles      3
Charles      3

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Обновление может присоединиться к подзапросу, который подсчитывает эти типы по имени для таблицы B.
Затем новые "Настройки" могут быть рассчитаны на основе этих итогов.

UPDATE a
SET a.Settings = (CASE
                  WHEN b.TotalTypeA > 0 AND b.TotalTypeB > 0 THEN 3
                  WHEN b.TotalTypeB > 0 THEN 2
                  WHEN b.TotalTypeA > 0 THEN 1
                  ELSE 0
                  END)
FROM TableA a
LEFT JOIN 
(
  SELECT Name, 
  COUNT(CASE WHEN Type = 'TypeA' THEN 1 END) TotalTypeA,
  COUNT(CASE WHEN Type = 'TypeB' THEN 1 END) TotalTypeB
  FROM TableB 
  GROUP BY Name
) b 
ON b.Name = a.Name;

Тест на RexTester здесь

1 голос
/ 31 марта 2019

Я считаю, что агрегированный коррелированный подзапрос может выполнить работу, например:

UPDATE ta
SET Settings = (
    SELECT
        CASE 
            WHEN MAX(tb.Type) = 'TypeA' AND MIN(tb.Type) = 'TypeA' THEN 1
            WHEN MAX(tb.Type) = 'TypeB' AND MIN(tb.Type) = 'TypeB' THEN 2
            ELSE 3
       END
    FROM TableB tb
    WHERE tb.Name = ta.Name AND Type in ('TypeA', 'TypeB')
    GROUP BY tb.Name
)
FROM TableA ta

В этой демонстрации на DB Fiddle с вашими примерами данных приведено содержимое TableA после выполнения UPDATE:

Name    | Settings
:------ | -------:
Andre   |        1
Andre   |        1
Betty   |        2
Charles |        3
Charles |        3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...