我有一张桌子,例如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 ..
答案 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)