Может быть одна из этих причин, почему ваше обновление не работает. Я не знаю точной структуры вашей таблицы. Вы не предоставили образцы данных. Если ваш account_dim_key уникален для каждой строки, тогда select lag() ... from schema.d_account ac2 where ac1.account_dim_key = ac2.account_dim_key)
вернет одну строку, и вы фактически обновите effective_start_dt
до effective_start_dt
(это значение по умолчанию для функции задержки)
Если ваш account_dim_key одинаков для всех этих строк, которые вы предоставили в качестве образца, тогда select lag() ... from schema.d_account ac2 where ac1.account_dim_key = ac2.account_dim_key)
вернет несколько строк, и Oracle будет жаловаться, что ОБНОВЛЕНИЕ невозможно (есть конкретное сообщение об ошибке, я не помню точную формулировку.
Чтобы ваш запрос работал, вам нужно использовать другой подход:
update schema.d_account ac1
set effective_start_dt = (select prev_dt from
(select lag(effective_end_dt, 1, effective_start_dt) over(partition by id order by effective_end_dt asc) as prev_dt
, ROWID as rid
from schema.d_account ac2) a where a.rid = ROWID),
audit_last_update_dt = sysdate,
where id in '0013600000USKLqAAP'
Итак, в основном у вас есть подзапрос a
со столбцом ROWID, в котором вы строите предыдущую дату. Для оператора UPDATE вы присоединяетесь к этому подзапросу по ROWID.
Примечание. Если ваш account_dim_key уникален для каждой строки, вы можете использовать его вместо ROWID: вы можете повысить производительность в зависимости от индексов, которые у вас есть для вашей таблицы.
ОБНОВЛЕНИЕ: приведенный выше запрос может привести к плохой производительности. Вам будет лучше с оператором MERGE ниже:
MERGE INTO (SELECT id, effective_start_dt, ROWID rid, audit_last_update_dt
FROM schema.d_account WHERE id in '0013600000USKLqAAP') ac1
USING (select lag(effective_end_dt, 1, effective_start_dt) over(partition by id order by effective_end_dt asc) as prev_dt
, ROWID as rid
from schema.d_account) ac2
ON (ac1.rid = ac2.rid)
WHEN MATCHED THEN UPDATE SET ac1.effective_start_dt = ac2.prev_dt,
ac1.audit_last_update_dt = sysdate;
person
cha
schedule
23.11.2016