SQL多行插入带有/来自不同表的多个选择

时间:2014-09-09 15:15:32

标签: sql oracle

我正在尝试根据我从另一个表中提取的值进行多次插入。基本上,我需要为所有现有用户提供访问以前可以访问其他服务的服务。 Table1将获取数据并运行一个作业来执行此操作。

   INSERT INTO Table1 (id, serv_id, clnt_alias_id, serv_cat_rqst_stat)
SELECT
  (SELECT Max(id) + 1
     FROM Table1 ),
  '33', --The new service id
  clnt_alias_id,
  'PI' --The code to let the job know to grant access
FROM TABLE2,
WHERE serv_id = '11' --The old service id

我在id上遇到主键约束错误。

请帮忙。

谢谢, 科林

2 个答案:

答案 0 :(得分:0)

这个查询是不可能的。 max(id)子选择将仅评估ONCE并为父查询中的所有行返回相同的值:

MariaDB [test]> create table foo (x int);
MariaDB [test]> insert into foo values (1), (2), (3);
MariaDB [test]> select *, (select max(x)+1 from foo) from foo;
+------+----------------------------+
| x    | (select max(x)+1 from foo) |
+------+----------------------------+
|    1 |                          4 |
|    2 |                          4 |
|    3 |                          4 |
+------+----------------------------+
3 rows in set (0.04 sec)

您必须多次运行查询,对于您尝试复制的每条记录,都需要执行一次。这样,max(id)将从上一个查询中获取ID。

答案 1 :(得分:0)

是否要求Table1.id为增量内联?如果没有,只需将clnt_alias_id添加到Max(id)即可。这是一个讨厌的解决方法,你应该尝试将该列的类型更改为auto_increment,就像Marc B建议的那样。