Oracle - 创建一个从多表插入维度表的过程

Posted

技术标签:

【中文标题】Oracle - 创建一个从多表插入维度表的过程【英文标题】:Oracle - Create a procedure to insert into a dimension table from multi tables 【发布时间】:2014-11-16 02:58:08 【问题描述】:

我正在为小型电子商务设计一个数据仓库,我需要从两个表 product 和 product_price_history 填充产品的维度表。为简单起见,假设每个表的列如下:

产品(prod_id,品牌) product_price_history (prod_id, price, min_pirce, start_date, end_date) product_dim (prod_key, prod_id, brand, price, min_pirce, start_date, end_date)

我已经有一个名为 prod_seq 的序列来为 product_dimension 表生成键。这是我到目前为止的程序,但我收到了错误:

create or replace 
procedure populate_product_dimension AS
BEGIN
INSERT into product_dim (prod_key, prod_id, brand, price, min_pirce, start_date, end_date)
SELECT seq_prod.nextval FROM DUAL
SELECT prod_id, brand
FROM product
SELECT price, min_pirce, start_date, end_date
FROM product_price_history
WHERE prod_id.product_pric_history = prod_id.product &
prod_id not in(select prod_id from product_dim);
Commit;
End populate_product_dimension;

我认为问题可能与我添加 prod_key 的方式有关。有谁知道更好的方法吗?

【问题讨论】:

【参考方案1】:

SELECT 用于INSERT 的查询。它必须是 JOIN 并且您的语法错误。在引用列时,它必须是 table_name/alias.column_name。

create or replace 
procedure populate_product_dimension AS
BEGIN
INSERT into product_dim (prod_key, prod_id, brand, price, min_pirce, start_date, end_date)
SELECT 
       seq_prod.nextval,
       p.prod_id,
       p.brand,
       ph.price,
       ph.min_pirce,
       ph.start_date,
       ph.end_date
FROM 
       product_price_history ph,
       product p
WHERE 
      ph.prod_id = p.prod_id
  AND ph.prod_id not in(select prod_id from product_dim);

Commit;
End populate_product_dimension;

【讨论】:

谢谢先生。做到了!现在假设我想在我的维度表中添加一个状态列,如果 product_history_table 中的 end_date 未设置(null),它会使用 Availble 填充其值,如果不是 No Available。上面的代码有可能吗? NVL2(ph.end_date,'Available','Not Available') 会这样做

以上是关于Oracle - 创建一个从多表插入维度表的过程的主要内容,如果未能解决你的问题,请参考以下文章

从多表连接后的select count(*)看待SQL优化

如何从多对多表中选择一对一关系

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。

Oracle数据库视图创建以及优点分析

oracle存储过程中临时表的使用,该怎么处理