我遇到一些需要循环的任务有困难。 作为Im pl / sql newbie,我不知道如何解决这个问题,有人可以看看吗?
也许最简单的方式是介绍而不是描述我想做的事情:
Select id from table1 t1 join table2 t2 on t1.column=t2.column2
insert into table2 id from previous operation.
Select id from table1 t1 join table2 t2 on t1.column=ts.column2 where t1.id in (Select id from table1 t1 join table2 t2 on t1.column=t2.column2);
insert into table2 id from previous operation
现在如果先前的操作返回一些数据,那么:
Select id from table1 t1 join table2 t2 on t1.column=t2.column2 WHERE t1.column in (Select id from table1 t1 join table2 t2 on t1.column=ts.column2 where t1.id in (Select id from table1 t1 join table2 t2 on t1.column=t2.column2)
insert into tablr2 id from previous operation
依此类推,直到select不会返回任何内容。
当然我意识到“select”会将重复的ID插入到table3中。 我只知道我必须使用循环,但不知道究竟是哪一个以及如何。有可能处理吗?
修改
再一次, 我有2张桌子:
Table1
Column1
1
2
3
4
5
6
7
8
9
Table2
Column1 Column2 Column3
2345 1 0
5346 2 0
67542 3 23432
3452 4 324665
64356 5 34234
23432 6 0
324665 7 67867
34234 8 0
67867 9 9
Table to insert:
ID
1
2
3
4
作为输入,我得到了具有ID的Table3,我想插入到例如。表4(ID)。
但是其中一些ID可能有一些父/子ID。这是在循环中如何做到这一点的主要困难。通常我们可以使用statement:
找到父/子ID从table1选择ID t1在t1.id = t2.Column2上连接Table2 t2 在t2.Column3 = t2.Column1
上加入Table2 t2现在基于“要插入的表”插入语句(进入表4)应该插入值: 1,2,3,4 + 6和7(我们可以看到6和7有父ID(Column0!= 0)。
现在我们要检查帐户6,7中是否有任何父/子ID与以前相同。 因此插入Table4应插入值:9 端。
当然,这种情况只描述2-3次迭代,如果会有更多的父/子ID?
我想使用一些表类型,并且在每个循环之后将ID放入表变量并将其用于其他迭代...
答案 0 :(得分:0)
将其设为insert into .. select from
insert into table2(id)
Select id from table1 t1 join table2 t2 on t1.column=t2.column2
答案 1 :(得分:0)
从您的问题看来,您似乎想要将所有ID插入到table2中,这对于table1和table2都是基于列“column”的。并且遗漏了没有任何共同点的其他行。
这意味着你希望table2包含table2 intersect table1(对于列“column”)
现在在sql中你可以轻松地做到这一点,因为它涉及设置操作而不是单行操作。
假设你的表1是
id列
1“A”
2“B”
3“C”
和table2是
id列
3“A”
4“C”
然后在表2中你要插入
1 - 因为“A”并且在table1和
中有id 13 - 因为“C”在table1中有id 3
你可以通过写
来做到这一点insert into table2 (id)
select id from table1 where column in (select column from table2) ;
----我根据您的输入编辑答案-------
所以这次我创建了整个表格,我尝试复制你提到的每一个场景。
让我们先创建req表集
create table table2 (row_id number , id number , parent_id number)
CREATE table TABLE1 (id number) ;
CREATE table TABLE3 (id number) ;
CREATE table TABLE4 (id number) ;
现在让我们在这些表中插入相同的值(如示例中所述)
--TABLE1 ---
INSERT INTO table1 VALUES
(1);
INSERT INTO table1 VALUES
(2);
INSERT INTO table1 VALUES
(3);
INSERT INTO table1 VALUES
(4);
INSERT INTO table1 VALUES
(5);
INSERT INTO table1 VALUES
(6);
INSERT INTO table1 VALUES
(7);
INSERT INTO table1 VALUES
(8);
INSERT INTO table1 VALUES
(9);
--TABLE2 ---
INSERT INTO table2 VALUES
(2345 , 1 , 0) ;
INSERT INTO table2 VALUES
(5346 , 2 , 0) ;
INSERT INTO table2 VALUES
(67542 , 3 , 23432) ;
INSERT INTO table2 VALUES
(3452 , 4 , 324665);
INSERT INTO table2 VALUES
(64356 , 5 , 34234);
INSERT INTO table2 VALUES
(23432 , 6 , 0);
INSERT INTO table2 VALUES
(324665 , 7 , 67867);
INSERT INTO table2 VALUES
(34234 , 8 , 0);
INSERT INTO table2 VALUES
(
67867 , 9 , 9);
--TABLE3 ---
INSERT INTO table3 VALUES
(1);
INSERT INTO table3 VALUES
(2);
INSERT INTO table3 VALUES
(3);
INSERT INTO table3 VALUES
(4);
set serveroutput on ;
现在运行这个anoy块将满足需求。
DECLARE
table_var VARCHAR2(30) := 'TABLE3' ; -- replace this with any table
lvc_cur sys_refcursor ;
l_num NUMBER ;
cnt number := 0 ;
BEGIN
OPEN lvc_cur FOR 'select distinct id from '||table_var ||' where id in (select table1.id from table1 , table2 where table1.id = table2.id )';
loop
fetch lvc_cur into l_num ;
exit WHEN lvc_cur%notfound ;
INSERT INTO table4(ID)
select id from table2 connect by prior parent_id = row_id start with id = l_num ;
end loop ;
END ;
通过运行以下查询来检查
select * from table4
ID
----------
1
2
4
7
9
3
6
7 rows selected