Необходимо обновить несколько разных столбцов в одной таблице только из одного столбца, найденного в другой таблице

#sql #snowflake-cloud-data-platform #snowflake-schema

Вопрос:

У меня есть две таблицы, TBL_A и TBL_B.

TBL_A выглядит так:

введите описание изображения здесь

TBL_B выглядит так:

введите описание изображения здесь

Мне нужно обновить TBL_B на основе информации, найденной в TBL_A для ДАТЫ и времени, которая соответствует определенному статусу, поэтому:

  when status = 'CLAIMED' put DATETIME in CLAIMED_DATETIME
 when status = 'BOUGHT' put DATETIME in BOUGHT_DATETIME
 when status = 'RETURNED' put DATETIME in RETURNED_DATETIME
 

У меня есть такой запрос:

    MERGE INTO TBL_B B
USING (
      SELECT * FROM TBL_A
    PIVOT(MIN(ACCOUNT_REWARD_UPDATED_AT_DATETIME) FOR ACCOUNT_REWARD_STATUS IN ('claimed', 'bought', 'returned')) 
     AS P (number_id, country, amount, currency, file_tp, ingestion_time, claimed, bought, returned)
) A ON (
       A.number_id = B.number_id, 
    and  A.country = B.country, 
    and A.amount = B.amount, 
    and A.currency = B.currency, 
    and A.file_tp = B.file_tp 
    and A.ingestion_time = B.ingestion_time
 )
WHEN MATCHED THEN
  UPDATE SET
    B.CLAIMED_DATETIME = IFF(A.claimed IS NOT NULL, A.claimable , '2999-12-31 23:59:5'),
    B.BOUGHT_DATETIME = IFF(A.bought IS NOT NULL, A.claimed , '2999-12-31 23:59:5'),
    B.RETURNED_DATETIME = IFF(A.reverted IS NOT NULL, A.reverted, '2999-12-31 23:59:5'); 
 

Когда я присоединяюсь ко ВСЕМ столбцам, file_tp и ingestion_time различаются для каждого статуса (заявлен, куплен и возвращен), а остальные столбцы одинаковы для каждого статуса. Когда я запускаю запрос выше, он обновляет только 1 ДАТУ, а не все из них. Я понял, что это потому, что я не могу присоединиться к FILE_TP и INGESTION_TIME, так как они разные для каждого статуса. ОДНАКО, когда я удаляю их из условия соединения, я получаю сообщение об ошибке:

    MERGE INTO TBL_B B
USING (
      SELECT * FROM TBL_A
    PIVOT(MIN(DATETIME) FOR STATUS IN ('claimed', 'bought', 'returned')) 
     AS P (number_id, country, amount, currency, file_tp, ingestion_time, claimed, bought, returned)
) A ON (
       A.number_id = B.number_id, 
    and  A.country = B.country, 
    and A.amount = B.amount, 
    and A.currency = B.currency, 
    --and A.file_tp = B.file_tp 
    --and A.ingestion_time = B.ingestion_time
 )
WHEN MATCHED THEN
  UPDATE SET
    B.CLAIMED_DATETIME = IFF(A.claimed IS NOT NULL, A.claimable , '2999-12-31 23:59:5'),
    B.BOUGHT_DATETIME = IFF(A.bought IS NOT NULL, A.claimed , '2999-12-31 23:59:5'),
    B.RETURNED_DATETIME = IFF(A.reverted IS NOT NULL, A.reverted, '2999-12-31 23:59:5'); 
 

ошибка:

 Duplicate row detected during DML action Row Values: 
 

Кто-нибудь знает, как я могу это исправить?

Комментарии:

1. «Когда я выполняю приведенный выше запрос, он обновляет только 1 ДАТУ, а не все» — вы имеете в виду, что необходимо обновить несколько строк, которые имеют одинаковое значение (number_id, страна, сумма, валюта)?

Ответ №1:

Я подозреваю, что стержень делает не то, что вы от него ожидаете, — проверяет свои результаты.

Попробуйте изменить это:

       SELECT * FROM TBL_A
    PIVOT(MIN(DATETIME) FOR STATUS IN ('claimed', 'bought', 'returned')) 
     AS P (number_id, country, amount, currency, file_tp, ingestion_time, claimed, bought, returned)
) A ON (
       A.number_id = B.number_id, 
    and  A.country = B.country, 
    and A.amount = B.amount, 
    and A.currency = B.currency, 
    --and A.file_tp = B.file_tp 
    --and A.ingestion_time = B.ingestion_time
 

к этому:

     SELECT * 
    FROM (select number_id, country, amount, currency from TBL_A)
    PIVOT(MIN(DATETIME) FOR STATUS IN ('claimed', 'bought', 'returned')) 
    AS P (number_id, country, amount, currency, claimed, bought, returned)
) A ON (
    A.number_id = B.number_id, 
    and A.country = B.country, 
    and A.amount = B.amount, 
    and A.currency = B.currency, 
 

Комментарии:

1. Всем привет! Да, я пробовал это изначально, однако, когда я помещаю первичные ключи и не включаю те, которые мне нужны, это портит весь заказ. В нем будут указаны все значения, соответствующие file_tp, и так далее.

2. поэтому, если у меня есть P как (number_id, страна, сумма, валюта, заявленная, купленная, возвращенная), то он захватывает все столбцы в исходной таблице и устанавливает их в соответствии с тем, что у меня есть в списке, независимо от значения

3. Если вам нужна дополнительная помощь, вам нужно будет предоставить нам некоторые примеры данных и то, как должны выглядеть желаемые результаты — будьте, пожалуйста, откровенны в том, как текущий запрос не выполняется.