在表中插入值只有一列更改值

时间:2014-08-07 18:25:00

标签: sql plsql oracle11g

我有一个有两列的表,

GROUP    PROJECTS
10001       1
10001       2

第一列(GROUP)保持相同的值10001。 第二栏(PROJECTS)更改值3,5,9,100等(我有400个项目ID')

如何更正(循环?)语句以插入所有400个PROJECTS。 我使用insert,值来表示较小的列表。

INSERT INTO table (GROUP_ID, PROJECTS) VALUES (10001, 1, 10001, 2, 10001, etc, 10001, etc);

我在Excel中有列表(如果需要,我可以创建一个包含所有400个项目ID的临时表)

感谢。

3 个答案:

答案 0 :(得分:1)

我通常会将这样的插入内容写为:

INSERT INTO table(GROUP_ID, PROJECTS)
    select 10001, 1 from dual union all
    select 10001, 2 from dual union all
    . . . ;

您应该能够在Excel中轻松生成select语句。

答案 1 :(得分:0)

如果项目ID存在于他们自己的表中(或者您可以从Excel数据中创建一个),那么yu可以从那里获取值列表并交叉连接所有组ID:

insert into group_projects (group_id, project_id)
select g.group_id, p.project_id
from groups g
cross join projects p
where not exists (
  select 1 from group_projects gp 
  where gp.group_id = g.group_id and gp.project_id = p.project_id
);

where not exists()排除了所有现有对,因此您不会插入重复项。

SQL Fiddle

如果这些群组没有自己的表格,那么您可以使用子查询中的现有值:

insert into group_projects (group_id, project_id)
select g.group_id, p.project_id
from (select distinct group_id from group_projects) g
cross join projects p
where not exists (
  select 1 from group_projects gp 
  where gp.group_id = g.group_id and gp.project_id = p.project_id
);

如果你不想为那些人创建一个表,你可以使用Gordon的方法生成项目ID列表作为子查询。

答案 2 :(得分:0)

我会选择我认为更简单,更易读的解决方案...使用Excel中的数据创建临时表,然后运行 ​​-

DECLARE
CURSOR c1
IS
SELECT project_id
 FROM temp_table
WHERE project_id IS NOT NULL;
BEGIN
FOR rec in c1
LOOP
  INSERT INTO table
  VALUES (10001, rec.project_id);
 COMMIT;
END LOOP;
END;

似乎比一个巨大的插入语句更清晰,或者具有连接和子查询的复杂事物。如果要确保“table”中不存在该值,请将该条件添加到游标select语句中,或者如果对表有约束,则在循环中添加异常处理程序。