這是它如何能夠在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
更新它們,但記錄的空間會無緣無故地膨脹。
另一種方法是使用派生表:
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 ;
基於「命令無法正常結束」我假設甲骨文。 –
@Ryan - 這在TSQL專有的'UPDATE ... FROM'語法中是有效的。但是根據錯誤消息,他們似乎沒有使用SQL Server。 –