【发布时间】:2012-05-10 17:54:36
【问题描述】:
我有一个main 数据库和一个report 数据库,我需要将一个表从main 同步到report。
但是,当 main 数据库中的项目被删除时,我只想在 report 数据库中设置一个 IsDeleted 标志。
有什么优雅的方法可以做到这一点?
我目前正在使用 MERGE 语句,如下所示:
MERGE INTO report.TEST target
USING (SELECT * FROM main.TEST) source
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET (target... = source...)
WHEN NOT MATCHED THEN
INSERT (...) VALUES (source...)
;
WHEN NOT MATCHED 语句为我提供了来自main 的所有新值,但我还想更新来自report 的所有旧值。
我正在使用 Oracle PL/SQL。
【问题讨论】:
-
您要使用哪些值更新
main.test?你会从哪里得到它们? -
如果从
main.test中删除该行,则对应的report.test行将不匹配。我想为所有不匹配的行设置report.test.IsDeleted标志。 -
我认为这是不可能的,因为底层 JOIN (
using (...)) 将不包含该行。那么这些数据应该从哪里来呢? -
那么,
MERGE是否类似于LEFT OUTER JOIN?我想我希望可能有一个FULL OUTER JOIN选项。 -
我认为 SQL Server 2008 有一个
WHEN NOT MATCHED ON SOURCE子句执行FULL OUTER JOIN!我找不到太多关于它的文档,但我在 Oracle 中尝试过但没有成功,所以我想我会看看其他选项。