SQL SERVER Обновление и вставка в другую таблицу с повторяющимся значением - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть две таблицы, Таблица A и B. Я хочу обновить столбец RAM_PARENT_CATEGORY_CODE таблицы A значением из таблицы B. Однако для category_alert_ctr 55 и 82. Существует 2 возможных RAM_PARENT_CATEGORY_CODE из таблицы B.

Я хочу вставить новую строку в таблицу A, чтобы вместить оба этих RAM_PARENT_CATEGORY_CODE (CRM1b и crm1c). Затем обновите значение, указав правильное значение из таблицы B.

Table A and B

Итак, ожидаемый результат будет:

55 | crm1b1 | CRM1     | CRM1b

83 | crm1b1 | CRM1     | crm1c

82 | Area1  | BuildApp | OFC01

84 | Area1  | BuildApp | OFC02

У вас есть идея сделать это? Спасибо.

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

При необходимости обновить столбец category_alert_ctr.

Чтобы проверить, нажмите здесь .

declare @A table(
    category_alert_ctr int,
    ram_category_code varchar(30),
    RAM_GROUP varchar(30),
    RAM_PARENT_CATEGORY_CODE varchar(30)
);

insert @A values
    (25, 'HLTHLIC_FF', 'HEALTHLIC', null),
    (28, 'M16', 'QBL', null),
    (55, 'crm1b1', 'CRM1', null),
    (55, 'crm1b1', 'CRM1', null),
    (82, 'Area1', 'BuildApp', null),
    (82, 'Area1', 'BuildApp', null);

declare @B table(
    RAM_CATEGORY_CODE varchar(30),
    RAM_GROUP varchar(30),
    RAM_PARENT_CATEGORY_CODE varchar(30)
);

insert @B values
    ('HLTHLIC_FF', 'HEALTHLIC', 'HLTHLC_RST'),
    ('M16', 'QBL', 'EPA'),
    ('crm1b1', 'CRM1', 'CRM1b'),
    ('crm1b1', 'CRM1', 'crm1c'),
    ('Area1', 'BuildApp', 'OFC01'),
    ('Area1', 'BuildApp', 'OFC02');

with
    a as (
        select
            *,
            iif(
                row_number() over(
                    partition by category_alert_ctr order by (select 0)
                ) = 1,
                category_alert_ctr,
                max(category_alert_ctr) over() +
                    row_number() over(order by category_alert_ctr) -
                    dense_rank() over(order by category_alert_ctr)
            ) new_category_alert_ctr,
            row_number() over(
                partition by category_alert_ctr order by (select 0)
            ) rn
        from @A
    ),
    b as (
        select
            *,
            row_number() over(
                partition by RAM_CATEGORY_CODE, RAM_GROUP
                order by RAM_PARENT_CATEGORY_CODE
            ) rn
        from @B
    )
update a
    set a.category_alert_ctr = a2.new_category_alert_ctr,
        a.RAM_PARENT_CATEGORY_CODE = b.RAM_PARENT_CATEGORY_CODE
from a
join a a2
    on a.category_alert_ctr = a2.category_alert_ctr and a.rn = a2.rn
join b
    on a.RAM_CATEGORY_CODE = a.RAM_CATEGORY_CODE and
       a.RAM_GROUP = b.RAM_GROUP and a.rn = b.rn
;

select * from @A;
0 голосов
/ 08 сентября 2018

Используйте оператор MERGE , чтобы вставить такие строки из таблицы B, которых нет в таблице A, и обновить те, которые находятся в таблице A.

Чтобы проверить, нажмите здесь .

with
  a as (
    select
      *,
      row_number() over(
        partition by category_alert_ctr order by (select 0)
      ) rn
    from @A
  ),
  b as (
    select
      *,
      row_number() over(
        partition by RAM_CATEGORY_CODE, RAM_GROUP
        order by RAM_PARENT_CATEGORY_CODE
      ) rn,
      row_number() over(
        order by RAM_CATEGORY_CODE, RAM_PARENT_CATEGORY_CODE
      ) cac_offset
    from @B
  ),
  m as (
    select
      a.category_alert_ctr,
      iif(b.rn = 1 and a.category_alert_ctr is not null,
          a.category_alert_ctr,
          max(a.category_alert_ctr) over() + b.cac_offset) new_cac,
      b.RAM_CATEGORY_CODE, b.RAM_GROUP, b.RAM_PARENT_CATEGORY_CODE, b.rn
    from b
    left join a
      on b.RAM_CATEGORY_CODE = a.ram_category_code and
         b.RAM_GROUP = a.RAM_GROUP and b.rn = a.rn
  )
merge a
using m
  on a.RAM_CATEGORY_CODE = m.RAM_CATEGORY_CODE and
     a.RAM_GROUP = m.RAM_GROUP and a.rn = m.rn
when matched then
  update set
    a.category_alert_ctr = m.new_cac,
    a.RAM_PARENT_CATEGORY_CODE = m.RAM_PARENT_CATEGORY_CODE
when not matched then
  insert(category_alert_ctr, ram_category_code,
         RAM_GROUP, RAM_PARENT_CATEGORY_CODE)
  values(m.new_cac, m.RAM_CATEGORY_CODE,
         m.RAM_GROUP, m.RAM_PARENT_CATEGORY_CODE)
;
0 голосов
/ 07 сентября 2018

для обработки нескольких совпадений, используйте row_number () для генерации уникальной нумерации для совпадения

UPDATE     A
SET        RAM_PARENT_CATEGORY_CODE = B.RAM_PARENT_CATEGORY_CODE 
FROM       (
               SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY RAM_CATEGORY_CODE, RAM_GROUP 
                                                     ORDER BY RAM_CATEGORY_CODE)
               FROM   TABLEA
           ) A
INNER JOIN (
               SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY RAM_CATEGORY_CODE, RAM_GROUP 
                                                     ORDER BY RAM_CATEGORY_CODE)
               FROM   TABLEB
           ) B
ON         A.RAM_CATEGORY_CODE = B.RAM_CATEGORY_CODE
AND        A.RAM_GROUP         = B.RAM_GROUP
AND        A.RN                = B.RN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...