在Oracle 11中的MERGE UPDATE中创建两个WHERE子句

时间:2012-04-15 18:53:26

标签: sql oracle sqlplus

我有两个具有相同结构的表: masterTable(id,description,list_price) 和 changesTable(id,description,list_price)

我想将来自changesTable的更改合并到masterTable中,但我不想在更改时更新masterTable中的'description',我想保留旧值

我试图这样做

WHEN MATCHED THEN
UPDATE SET master.list_price=changes.list_price,
master.description=ch.description   
WHERE length(changes.description)>0

但在这种情况下,list_price也不会更新。

如何正确合并它们? 感谢

  

以下是问题的描述:使用单个合并语句   使用表中的数据更新upd_services表   upd_services_changes_2。此合并将包括更新,删除和   插入。对于此任务,删除由负价格表示   变更表。如果更改表中的描述字段是   null然后在您更改服务表中的描述时   做更新。只有在列表价格为0或更高时才进行插入。

2 个答案:

答案 0 :(得分:1)

WHEN MATCHED THEN
UPDATE SET master.list_price=changes.list_price,
master.description=ch.description   
WHERE length(changes.description)>0

这只会在length(changes.description)> 0时更新,但是你打算说'总是更新list_price但只更新列表描述,当它长度为零'时你可以在两个合并中执行此操作,

WHEN MATCHED THEN
UPDATE SET master.list_price=changes.list_price

WHEN MATCHED THEN
UPDATE SET 
master.description=ch.description   
WHERE length(changes.description)>0

或检查SQL dialect syntax是否有指定两种情况的方法。

提示 :有一种方法可以执行此操作,但不能使用WHERE语句。你需要使用CASE。试一试,如果你有更多问题,请稍后再回来。

答案 1 :(得分:1)

你可以试试这个


WHEN MATCHED THEN
UPDATE SET master.list_price=changes.list_price,
master.description = DECODE(ch.description ,
                             NULL,
                             master.description,
                             ch.description )

在这种情况下,如果ch.description为null,则保留原始值(即master.description),否则在master.description上覆盖ch.description

希望有所帮助