我有一个有两列的表,
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的临时表)
感谢。
答案 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()
排除了所有现有对,因此您不会插入重复项。
如果这些群组没有自己的表格,那么您可以使用子查询中的现有值:
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语句中,或者如果对表有约束,则在循环中添加异常处理程序。