合并数据的同时选择值
当您更新现有数据并在一次合并操作中插入新数据时,您可以同时从这些行中选择值。
过程
要从合并的行中选择值:
在SELECT语句的FROM子句中指定MERGE语句。
当您将一行或多行合并到表格中时,您可以检索:
- 自动生成的列(如ROWID或标识列)的价值
- 列的任何默认值
- 合并行中的所有值,不指定单个列名
- 根据合并行变化计算出的数值
示例
假设STOCK表包含表1 中的数据。
| 符号 | PRICE |
|---|---|
| XCOM | 95.00 |
| YCOM | 24.50 |
现在,假设:hv_symbol和:hv_price是主机变量数组,其中包含与表1 中显示的数据相对应的更新数据。 表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中显示的数据。
SELECT FROM MERGE语句的以下输出包括对XCOM的更新和每行输出的DELTA值。
| 符号 | PRICE |
|---|---|
| XCOM | 107.00 |
| YCOM | 24.50 |
| 新C | 30.00 |
SYMBOL PRICE DELTA
=============================
XCOM 97.00 2.00
NEWC 30.00 30.00
XCOM 107.00 10.00