合并数据的同时选择值

当您更新现有数据并在一次合并操作中插入新数据时,您可以同时从这些行中选择值。

过程

要从合并的行中选择值:

在SELECT语句的FROM子句中指定MERGE语句。
当您将一行或多行合并到表格中时,您可以检索:
  • 自动生成的列(如ROWID或标识列)的价值
  • 列的任何默认值
  • 合并行中的所有值,不指定单个列名
  • 根据合并行变化计算出的数值
使用SELECT FROM MERGE语句指定FINAL TABLE子句。 最终表(FINAL TABLE)由合并后的表或视图的行组成。

示例

假设您需要将数据输入STOCK表,该表包含您股票组合中的公司股票代码和股票价格。 您输入的部分数据涉及已经存在于“股票”表中的公司;部分数据涉及您正在添加到股票组合中的公司。 如果股票代码存在于股票表的符号列中,则需要更新价格列。 如果公司的股票代码尚未出现在“股票”表中,您需要插入一行新的股票代码和股票价格。 此外,您需要在输出中添加新的值DELTA,以显示股价的变化。
假设STOCK表包含表1 中的数据。
表 1. 在 SELECT FROM MERGE 语句之前的 STOCK 表
符号 PRICE
XCOM 95.00
YCOM 24.50
现在,假设:hv_symbol和:hv_price是主机变量数组,其中包含与表1 中显示的数据相对应的更新数据。 表2 显示了股票活动的宿主变量数据。
表 2. 股票活动的主变量数组
hv_符号 hv_价格
XCOM 97.00
新C 30.00
XCOM 107.00

NEWC是STOCK表中的新项目,因此需要将其代码和价格填入STOCK表中。 表 2 中 XCOM 的行代表变化的股票价格,因此需要在 STOCK 表中更新这些值。 此外,输出结果需要以DELTA值的形式显示股票价格的变化。

下面的 SELECT FROM MERGE 语句更新了 XCOM 的价格,并插入 NEWC 的代码和价格,返回的输出包括股票价格变化的 DELTA 值。
SELECT SYMBOL, PRICE, DELTA FROM FINAL TABLE
  (MERGE INTO STOCK AS S INCLUDE (DELTA DECIMAL(5,20)
   USING ((:hv_symbol, :hv_price) FOR :hv_nrows ROWS) AS R (SYMBOL, PRICE)
   ON S.SYMBOL = R.SYMBOL
     WHEN MATCHED THEN UPDATE SET 
       DELTA = R.PRICE - S.PRICE, PRICE=R.PRICE
     WHEN NOT MATCHED THEN INSERT 
       (SYMBOL, PRICE, DELTA) VALUES (R.SYMBOL, R.PRICE, R.PRICE)  
NOT ATOMIC CONTINUE ON SQLEXCEPTION);

INCLUDE子句指定可以在输出中返回一个附加列DELTA,而无需在STOCK表中添加一个列。 MERGE语句的UPDATE部分将DELTA值设置为先前股票价格与更新操作设置值的差值。 MERGE语句的INSERT部分将DELTA值设置为与PRICE列相同的值。

SELECT FROM MERGE语句处理后,STOCK表包含表3中显示的数据。
表 3. SELECT FROM MERGE语句后的STOCK表
符号 PRICE
XCOM 107.00
YCOM 24.50
新C 30.00
SELECT FROM MERGE语句的以下输出包括对XCOM的更新和每行输出的DELTA值。
SYMBOL    PRICE      DELTA
=============================
XCOM       97.00      2.00
NEWC       30.00     30.00
XCOM      107.00     10.00