sql - 从另一个表更新一个表,但也插入

标签 sql oracle oracle10g

我们有一个保存原始数据的源表:

SourceTable 
SD               Product  P1  P2 
'01-Mar-2013'    'Prod1'  1   2
'02-Mar-2013'    'Prod1'  3   4
'03-Mar-2013'    'Prod1'  5   6
'04-Mar-2013'    'Prod1'  7   8
'04-Mar-2013'    'Prod2'  6   5

我们有如下的目标表:

DestinationTable 
SD               Product  P1  P2 Active  
'01-Mar-2013'    'Prod1'   9  10    1

我正在尝试编写一个查询,该查询将为每个产品每天处理来自源表的数据,并将所有新行插入目标表,但我们还应该将事件列更新为 0目的地。如果在源中找到匹配的行(这是确定目标中是否存在 SD 和 Product 列)。

处理数据后,DestinationTable 应该如下所示:

SD               Product  P1  P2 Active  
'01-Mar-2013'    'Prod1'   9  10    0
'01-Mar-2013'    'Prod1'   1   2    1
'02-Mar-2013'    'Prod1'   3   4    1
'03-Mar-2013'    'Prod1'   5   6    1
'04-Mar-2013'    'Prod1'   7   8    1
'04-Mar-2013'    'Prod2'   6   5    1

我已尝试使用 MERGE 执行此操作,但是当找到匹配项时,您不能同时更新和插入。

MERGE DestinationTable AS d
USING (SELECT SD, Product, P1, P2 FROM SourceTable) AS s ON d.Product = s.Product AND s.SD = d.SD 
WHEN MATCHED THEN UPDATE SET d.P1 = s.P1, 
                         d.P2 = sdsP2
                         d.Active = 0
WHEN NOT MATCHED THEN
    INSERT(SD,Product, P1, P2, Active)
    VALUES(s.SD, s.Product, s.P1, s.P2, 1);

我实际上已经使用 OUTPUT 语句在 SQL 中完成了我想做的事情,但是这是针对 Oracle 10g 的,而 Oracle 没有与 SQL 相同的 OUTPUT。

还有其他方法可以实现吗?这不必通过 MERGE 完成,我愿意接受任何其他解决方案。

谢谢

最佳答案

你想做的是

  1. source中的所有记录插入destination
  2. source 中的任何匹配记录更新 destination.active

正如您正确指出的那样,您不能使用 MERGE 执行此操作,因为 MERGE 希望在找到匹配记录时执行更新,而不是更新和插入。

所以我认为您坚持将其作为两个语句来执行:update destination 首先插入来自 source 的记录。

UPDATE 和 INSERT 都支持 RETURNING 子句,这将允许您为更新或插入的行收集标识符(和其他列)。它在文档中:find out more .

关于sql - 从另一个表更新一个表,但也插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16421134/

相关文章:

php - SQL - 连接两个表

sql - 如何统计文件被修改为特定日期时间格式的时间

sql - Oracle sqlplus : relative paths starting at position of script

php - 当我加入另一个表时发现查询错误

java - 可以在 JDBC/MySQL 中检索更新的行吗?

database - 将字符串中的表达式转换为过程中的 bool 值 (PL/SQL) Oracle

sql - 在 oracle 中的 View 上触发

mysql - base64 编码 HTML 编辑器文本以存储在数据库中

oracle - 可以将 oracle 11g 客户端与 10g 服务器一起使用吗?

php - Oracle 10.x 到 MySQL 5.x 的转换