Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于同一表中的“主”记录在表中插入记录_Sql_Oracle_Merge - Fatal编程技术网

Sql 基于同一表中的“主”记录在表中插入记录

Sql 基于同一表中的“主”记录在表中插入记录,sql,oracle,merge,Sql,Oracle,Merge,我有一个表,例如pricerules,它按商品为客户存储了特殊价格。现在我想基于其他用户同步pricerules。假设我将此作为数据集: +---------------------------+ | user_id | prod_id | price | +---------+---------+-------+ | 10 | 1 | 1 | | 10 | 2 | 5 | | 10 | 3 | 7 | |

我有一个表,例如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的价格更新/插入其他几个用户的价格。我已经编写了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