2017-01-27 7 views
0

Я работаю над оператором обновления, где мне нужно обновить неверные идентификаторы с правильным. Ниже мой код: Принимая правильный и неправильный код в летучем таблице:TDWM filter voilation: Bad Unconstrained product Присоединиться

CREATE VOLATILE TABLE VT 
AS 
(
SELECT 
    NAME 
    ,DESC 
    ,FIRST_VALUE(CODE) 
    OVER (PARTITION BY NAME,DESC,SRC_TYPE_CD 
      ORDER BY CODE) AS CORRECT_CODE 
    ,CODE AS INCORRECT_CODE 
    ,SRC_TYPE_CD 
FROM DB.CPT 
QUALIFY 
    COUNT(*) 
    OVER (PARTITION BY NAME,DESC,SRC_TYPE_CD 
     ORDER BY CODE 
     ROWS UNBOUNDED PRECEDING) > 1 
     ) WITH DATA 
ON COMMIT PRESERVE ROWS; 

Создание таблицы как исходная для целей тестирования:

CREATE TABLE DP_DB.CE_TEST AS 
(SELECT * FROM DB.EVNT WHERE 
SRC_TYPE_CD='CRM' and CODE is not null) 
WITH DATA AND STATS 
ON COMMIT PRESERVE ROWS; 

Обновления CE_TEST с летучим столом :

update a from DP_DB.CE_TEST a, vt b 
set CODE= b.CORRECT_CODE where 
a.CODE in (select b.INCORRECT_CODE from VT) 

Данное обновление не работает с нарушением прав пользователя. У меня нет другого столбца соответствия в двух таблицах. Что еще я могу сделать, чтобы оптимизировать этот запрос?

Ниже приводится пример из VT:

Name    Desc CORRECT_CODE INCORRECT_CODE SRC_TYPE_CD 
700 Calls Service 100 592    601 CRM 
700 Calls Service 100 592    595 CRM 
700 Calls Service 100 592    597 CRM 
700 Calls Service 100 592    598 CRM 
700 Calls Service 100 592    594 CRM 

Спасибо,

Amit

+1

Не можете просто использовать 'Обновление от DP_DB.CE_TEST а, б В.Т. множества КОД = b.CORRECT_CODE где a.CODE = b.INCORRECT_CODE и а. NAME = b.NAME и a. DESC = b. DESC и a.SRC_TYPE_CD = b.SRC_TYPE_CD' Это похоже на то, как вы разделяете CREATE TABLE. Конечно, это предполагает, что комбинация этих 4 столбцов уникальна. – dnoeth

+0

Hi Dnoeth, Я не могу использовать это состояние: и a. NAME = b.NAME и a. DESC = b. DESC и a.SRC_TYPE_CD = b.SRC_TYPE_CD как имя и desc, отсутствуют в другой таблице. Использование = condtion не дало правильный результат для образца, который я тестировал. Любой другой вариант? Я думал о попытке слияния. – user3901666

+0

Если ваш код не терпел неудачу из-за TASM, он потерпел неудачу с ошибкой, подобной «целевой строке, обновленной несколькими исходными строками». Каждая строка в вашей целевой таблице должна обрабатывать ровно одну строку в источнике. Не знаю, как это получится в вашем случае. – dnoeth

ответ

0

Вы все еще можете получить ошибку с целевой строки обновляется несколькими строками источника (вам нужно, чтобы избавиться от дублировать правильные/неправильные комбинации в VT, потому что вы не имеете квалификации на других столбцах, таких как имя, desc и т. д. позже))

update a from DP_DB.CE_TEST a, vt b 
set CODE= b.CORRECT_CODE where 
a.CODE in (select b.INCORRECT_CODE from VT) 

, вероятно, следует

update a from DP_DB.CE_TEST a, vt b 
set CODE= b.CORRECT_CODE 
where a.CODE = b.INCORRECT_CODE 
+0

Hi Lombardo, Я не вижу дубликатов правильных/неправильных комбинаций в VT. Ниже приведен пример – user3901666

+0

У вас все еще есть проблемы с этим? – user3901666