これは、Oracle で行う方法です。
UPDATE m_rqgrechunk a
SET a.persondept =
( SELECT b.persondept
FROM m_person_persondept_hist b
WHERE a.person = b.person
AND ( ( b.from_date IS NULL
AND b.to_date IS NULL )
OR ( b.from_date IS NULL
AND a.create_date < b.to_date )
OR ( a.create_date >= b.from_date
AND a.create_date < b.to_date )
OR ( a.create_date >= b.from_date
AND a.to_date IS NULL ) )
)
WHERE a.persondept IS NULL
AND EXISTS
( SELECT 1
FROM m_person_persondept_hist b
WHERE a.person = b.person
AND ( ( b.from_date IS NULL
AND b.to_date IS NULL )
OR ( b.from_date IS NULL
AND a.create_date < b.to_date )
OR ( a.create_date >= b.from_date
AND a.create_date < b.to_date )
OR ( a.create_date >= b.from_date
AND a.to_date IS NULL ) )
) ;
この場合、このNOT EXISTS
部分は実際には必要ありません。理由もなく肥大化するログスペースを除いて、更新される値は無効に更新NULL
しても(あまり)害がないからです。NULL
もう 1 つの方法は、派生テーブルを使用することです。
UPDATE
( SELECT a.persondept, b.persondept AS persondept_new
FROM m_rqgrechunk a
JOIN m_person_persondept_hist b
ON a.person = b.person
WHERE ( ( b.from_date IS NULL
AND b.to_date IS NULL )
OR ( b.from_date IS NULL
AND a.create_date < b.to_date )
OR ( a.create_date >= b.from_date
AND a.create_date < b.to_date )
OR ( a.create_date >= b.from_date
AND a.to_date IS NULL ) )
AND a.persondept IS NULL
)
SET persondept = persondept_new ;