Oracle SQL запрос для исправления нулевой проблемы в первичном ключе - PullRequest
0 голосов
/ 08 марта 2020
create table TEST
(
job_id integer
,etl_job_run_day date
,cust_sid integer
,cust_id number(38,0)
,cust_first_name varchar2(100)
,cust_last_name varchar2(100)
,effective_dt_from date
,effective_dt_to date
,version integer
,latest_fl varchar2(1)
,actual_cust_id integer
);


insert into abc values (123,02.03.20 00:00:00,100,6842,'Adam','Zampa',26.02.20 00:00:00,02.03.20 00:00:00,1,'N','');
insert into abc values (123,06.03.20 00:00:00,143,6842,'Tony','Greig',02.03.20 00:00:00,31.12.99 00:00:00,2,'Y',9011);

Текущая ситуация

JOB_ID  ETL_JOB_RUN_DAY    CUST_SID CUST_ID CUST_FIRST_NAME CUST_LAST_NAME   EFFECTIVE_DATE_FROM   EFFECTIVE_DATE_TO    VERSION LATEST_FL ACTUAL_CUST_ID
123 02.03.20 00:00:00   100 6842    Adam    Zampa   26.02.20 00:00:00   02.03.20 00:00:00   1   N   
123 06.03.20 00:00:00   143 6842    Adam    Zampa   02.03.20 00:00:00   31.12.99 00:00:00   1   Y   9011

Ожидаемое решение будет

JOB_ID  ETL_JOB_RUN_DAY    CUST_SID CUST_ID CUST_FIRST_NAME CUST_LAST_NAME   EFFECTIVE_DATE_FROM   EFFECTIVE_DATE_TO    VERSION LATEST_FL ACTUAL_CUST_ID
123 02.03.20 00:00:00   100 6842    Adam    Zampa   26.02.20 00:00:00   02.03.20 00:00:00   1   N   **9011**
123 06.03.20 00:00:00   143 6842    Adam    Zampa   02.03.20 00:00:00   31.12.99 00:00:00   1   Y   9011

поэтому ранее историческое обновление не было сделано должным образом. поэтому у меня в основном две версии, такие же, как и выше, у меня есть несколько сотен записей в этой ситуации ACTUAL_CUST_ID в настоящее время имеет значения NULL, поэтому необходимо обновить все записи, в которых ACTUAL_CUST_ID имеет значение NULL, и обновить значение другой версии для пример 9011 должен быть обновлен там, где у нас есть ноль.

, поскольку, как я уже упоминал, существует множество таких записей, поэтому мне нужно придумать оператор слияния, использующий функцию запаздывания или опережения для исправления всех записей, может ли любой один предоставит мне лучшее решение?

1 Ответ

1 голос
/ 08 марта 2020

Вы можете написать оператор обновления следующим образом:

Update test t
Set t.actual_cust_id = 
(Select max(t1.actual_cust_id)
From test t1
Where t.job_id = t1.job_id
And t.cust_id = t1.cust_id)
Where 
t.actual_cust_id is null
And exists 
(Select 1 from test t2
Where t.job_id = t2.job_id
And t.cust_id = t2.cust_id
And t2.actual_cust_id is not null)

db <> fiddle demo

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...