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

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

ОШИБКА: Обновление отменено: попытка обновить целевую строку значениями из нескольких строк объединения

Вот мой код:

UPDATE SERGIU_BI_CCM_AGG_MTH t1
  SET t1.CURRENT_SEC = foo.CURRENT_SEC
  FROM (
  SELECT t1a.sub_id, t1a.CURRENT_BRAND, t2.CURRENT_SEC, t2.from_date,      
  t2.to_date
  FROM SERGIU_BI_CCM_AGG_MTH t1a
     LEFT JOIN BI_CCM_BASE t2
     ON t1a.sub_id = t2.sub_id and t1a.CURRENT_BRAND = t2.CURRENT_BRAND
  )
  foo 
WHERE t1.sub_id = foo.sub_id and t1.CURRENT_BRAND = foo.CURRENT_BRAND    
 and  t1.agg_mth between to_char(foo.from_date,'YYYYMM') and   
 to_char(foo.to_date-1,'YYYYMM');

Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Дубликаты вызывают ошибку, давайте получим уникальную запись для каждого sub_id и CURRENT_BRAND, используя row_number().

, попробуйте запрос ниже

UPDATE SERGIU_BI_CCM_AGG_MTH t1
SET t1.CURRENT_SEC = foo.CURRENT_SEC
FROM (
        SELECT t1a.sub_id
            , t1a.CURRENT_BRAND
            , t2.CURRENT_SEC
            , t2.from_date
            , t2.to_date
            , row_number() over (partition by t1a.sub_id,CURRENT_BRAND order by from_date desc) as rn
        FROM SERGIU_BI_CCM_AGG_MTH t1a
        LEFT JOIN BI_CCM_BASE t2 ON t1a.sub_id = t2.sub_id 
            and t1a.CURRENT_BRAND = t2.CURRENT_BRAND
      )foo 
WHERE t1.sub_id = foo.sub_id 
    and t1.CURRENT_BRAND = foo.CURRENT_BRAND    
    and t1.agg_mth between to_char(foo.from_date,'YYYYMM') and to_char(foo.to_date-1,'YYYYMM');
    and foo.rn = 1
0 голосов
/ 18 октября 2019

Вам нужен следующий запрос.

    UPDATE SERGIU_BI_CCM_AGG_MTH t1
    SET t1.CURRENT_SEC = (SELECT  t2.CURRENT_SEC   
    FROM SERGIU_BI_CCM_AGG_MTH t1a
    LEFT JOIN BI_CCM_BASE t2
    ON t1a.sub_id = t2.sub_id and t1a.CURRENT_BRAND = t2.CURRENT_BRAND
WHERE t1.sub_id = foo.sub_id and t1.CURRENT_BRAND = foo.CURRENT_BRAND    
      and  t1.agg_mth between to_char(foo.from_date,'YYYYMM') and   
      to_char(foo.to_date-1,'YYYYMM'))                 
0 голосов
/ 18 октября 2019

Я думаю, что вы можете использовать следующие 2 способа:

  • с "join"

UPDATE SERGIU_BI_CCM_AGG_MTH t1
    LEFT JOIN BI_CCM_BASE t2
        ON t1.sub_id = t2.sub_id and t1.CURRENT_BRAND = t2.CURRENT_BRAND
  SET t1.CURRENT_SEC = t2.CURRENT_SEC
WHERE t1.agg_mth between to_char(t2.from_date,'YYYYMM') and   
 to_char(t2.to_date-1,'YYYYMM');
  • без "join":
UPDATE SERGIU_BI_CCM_AGG_MTH t1, BI_CCM_BASE t2
  SET t1.CURRENT_SEC = t2.CURRENT_SEC
WHERE t1.sub_id = t2.sub_id and t1.CURRENT_BRAND = t2.CURRENT_BRAND 
 and  t1.agg_mth between to_char(t2.from_date,'YYYYMM') and   
 to_char(t2.to_date-1,'YYYYMM');

Надеюсь, это поможет! :)

...