在游标中找不到NULL值

时间:2015-09-11 05:52:10

标签: oracle plsql merge

我想:

创建一个游标,获取商店中商品的所有当前价格。 我通过使用MERGE语句批量收集游标并循环upserting到STORE_INVENTORY表中。 现在我想将STORE_INVENTORY表中不在游标中的PRICE列清空。 第3步怎么办?我已经可以执行第1步和第2步,因为我已经更新或插入了从光标中提取的项目。

以下是一些示例数据:

有三个源表,由外部方更新。我的目标是获取这三个数据源并将其合并到一个单数表中。

SOURCE TABLES

ITEM_TYPES
  DESC_ID | TYPE 
  A       |  Kitchen
  B       |  Bath

ITEM_MANIFEST

  LOC_ID  | ORIGIN
  U       | USA
  C       | CHINA

ITEM_PRICE

  ITEM_ID | PRICE | DESC_ID | LOC_ID | DATE
  0       | 3.99  |  A      |  U     | 9/11/2015
  1       | 2.99  |  B      |  C     | 9/11/2015
  2       | 1.99  |  A      |  U     | 9/05/2015

目的地表

STORE_INVENTORY 
  ITEM_ID | TYPE    | ORIGIN | PRICE
  0       | Kitchen | CHINA  | 3.99
  8       | Bath    | USA    | 2.99

因此,在执行以日期作为参数的SQL过程之后。如果它在给定日期之后,它将仅从ITEM_PRICE拉出。

如果执行传入日期为9/10/2015的程序

预期产出

STORE_INVENTORY
0 | Kitchen | USA   | 3.99
1 | Bath    | China | 2.99
8 | Bath    | USA   | NULL

1 个答案:

答案 0 :(得分:0)

在通过主要联接将TYPE和ORIGIN提取到ITEM_PRICE之后,你不能做一个日期限制的ITEM_PRICE.PRICE子选项,而不限制日期吗?

即。类似的东西。

select ITEM_ID, TYPE, ORIGIN
/* not selecting PRICE in the main join */
,(select PRICE from ITEM_PRICE where your join conditions 
and DATE >= your param)
from ITEM_TYPES, ITEM_MANIFEST, ITEM_PRICE
where your join conditions, but no criteria on DATE

抱歉,如果您提供了现有查询,则会更清晰,更容易打字。

从重新阅读你的问题,我不确定你是否只插入2行但想要获得3.或者如果你有3行,但你想要将缺少的价格弄清楚。

如果目标表已经有3行,那么,不是采用基于CURSOR的方法(在高容量时可能会很慢而且编写起来很繁琐),为什么不用DATE作为标准来进行UPDATE呢?如果没有匹配,NULL将被分配给价格,这是UPDATE的工作方式。

  UPDATE STORE_INVENTORY set PRICE
  = (select PRICE from ITEM_PRICE where your join conditions 
  and DATE >= your param)