根据同一个表中的“主”记录在表中插入记录

时间:2012-03-20 13:30:37

标签: sql oracle merge

我有一张桌子,例如pricerules,为客户存储特殊价格的文章。现在我想基于其他用户同步pricerules。假设我将其作为数据集:

+---------------------------+
| user_id | prod_id | price |
+---------+---------+-------+
| 10      | 1       | 1     |
| 10      | 2       | 5     |
| 10      | 3       | 7     |
| 20      | 2       | 5     |
| 30      | 2       | 5     |
| 30      | 3       | 7     |
+---------+---------+-------+

现在我想基于用户10的价格更新/插入其他几个用户的价格。我已经编写了删除和更新查询,但我坚持使用插入查询来插入新规则其他用户还没有。

如此有效地执行以下插入:

INSERT INTO pricerules 
(user_id, prod_id, price) 
VALUES 
(20, 1, 1), 
(20, 3, 7), 
(30, 1, 1);

有没有办法在一个查询中执行此操作?我一直在寻找MINUS来选择用户20不存在的记录,但我必须为每个用户执行查询。

我想也许我可以使用MERGE

我正在使用Oracle 10.1 ..

3 个答案:

答案 0 :(得分:1)

你是对的。合并是要走的路。请尝试以下方法。

merge into pricerules p
using ( select t1.user_id, t2.prod_id, t2.price
   from 
   (select distinct user_id
   from pricerules
   where user_id <> 10) t1,
   (select distinct prod_id, price
   from pricerules
   where user_id = 10) t2
   ) t
on (p.user_id = t.user_id
   and p.prod_id = t.prod_id
   and p.price = t.price)
when not matched then 
   insert (user_id, prod_id, price) values (t.user_id, t.prod_id, t.price) ;

答案 1 :(得分:0)

我很久没有使用过Oracle了,所以我的语法可能略有偏差,但一般的想法是:

INSERT INTO pricerules 
(user_id, prod_id, price) 
select 20 as user_id, 1 as prod_id, 1 as price from dual
union all
select 20, 3, 7 from dual
union all
select 30, 1, 1 from dual

答案 2 :(得分:0)

快速输入这个,所以我不确定它是否正确。但我要做的是从用户10中选择新用户尚未拥有的所有产品ID。

您的问题中缺少的是user_id的来源。您可能希望将其与用户表连接,以便为所有用户运行它。

insert into pricerules
   (user_id, prod_id, price)
   select &new_user_id
         ,prod_id
         ,price
     from pricerules p
    where user_id = 10
      and not exists (select 1
             from pricerules p2
            where p2.userid = &new_userid
              and p2.prod_id = p.prod_id)