Sql 基于同一表中的“主”记录在表中插入记录
我有一个表,例如pricerules,它按商品为客户存储了特殊价格。现在我想基于其他用户同步pricerules。假设我将此作为数据集:Sql 基于同一表中的“主”记录在表中插入记录,sql,oracle,merge,Sql,Oracle,Merge,我有一个表,例如pricerules,它按商品为客户存储了特殊价格。现在我想基于其他用户同步pricerules。假设我将此作为数据集: +---------------------------+ | user_id | prod_id | price | +---------+---------+-------+ | 10 | 1 | 1 | | 10 | 2 | 5 | | 10 | 3 | 7 | |
+---------------------------+
| user_id | prod_id | price |
+---------+---------+-------+
| 10 | 1 | 1 |
| 10 | 2 | 5 |
| 10 | 3 | 7 |
| 20 | 2 | 5 |
| 30 | 2 | 5 |
| 30 | 3 | 7 |
+---------+---------+-------+
现在,我想根据用户10的价格更新/插入其他几个用户的价格。我已经编写了delete和update查询,但是我仍然使用insert查询来插入其他用户还没有的新规则
因此,这将有效地执行以下插入操作:
INSERT INTO pricerules
(user_id, prod_id, price)
VALUES
(20, 1, 1),
(20, 3, 7),
(30, 1, 1);
有没有一种方法可以在一个查询中实现这一点?我一直在寻找减号来选择用户20不存在的记录,但我必须为每个用户执行一个查询
我想也许我可以使用合并
我正在使用Oracle 10.1..我很久没有使用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
很快就把它打在一起了,所以我不确定它是否正确。但是我要做的是从用户10中选择新用户还没有的所有产品id 您的问题中缺少的是用户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)
你是对的。合并是一条路要走。请尝试以下方法
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) ;
OP要求它以用户10的价格为基础,因此可能需要将用户id为10的subqry t1和用户id为10的subqry t2添加到subqry t2中。不幸的是,当您还需要使用seq.nextval序列插入主键时,此方法似乎效果不太好。序列将始终加上+1。哪个字段由序列填充?我不想再让事情复杂化,但实际上在用户表中有一个字段属于用户id。因此,新的用户id将全部是从属于用户的用户中选择的用户id,用户id=10。我的挣扎完全一样:我找不到如何为每个用户输入该ID。因此,我能够找到新用户没有的价格规则,但我不知道用户id:-s