从循环/选择语句中插入表值作为变量
Posted
技术标签:
【中文标题】从循环/选择语句中插入表值作为变量【英文标题】:Insert into table values from loop/Select statement as a variable 【发布时间】:2015-11-03 12:54:33 【问题描述】:我对一些需要循环的任务有困难。 作为我的 pl/sql 新手,我不知道如何解决这个问题,有人可以看看吗?
也许最简单的方法是呈现而不是描述我想做的事情:
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 不会返回任何内容。
当然我知道“选择”会将重复的 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。这就是如何在循环中做到这一点的主要困难。一般我们可以通过using语句找到父/子ID:
从 table1 t1 中选择 ID 在 t1.id=t2.Column2 上加入 Table2 t2 在 t2.Column3=t2.Column1 上加入 Table2 t2
现在基于“要插入的表”插入语句(到 Table4 中)应该插入值: 1,2,3,4 + 6 和 7(我们可以看到 6 和 7 有父 id (Column0 ! = 0)。
现在我们要检查帐户 6,7 中的任何一个是否具有与以前相同的父/子 ID。 所以插入 Table4 应该插入值:9 结束。
当然这只是描述2-3次迭代的情况,如果会有更多的父/子ID怎么办?
我想使用一些表类型,并且在每个循环之后以某种方式将 ID 检入表变量并将其用于其他迭代......
【问题讨论】:
我不明白你为什么要使用嵌套子查询?也许您可以编辑您的问题以添加创建表语句,以及插入语句以创建一些示例数据,以及您所追求的预期输出。这样,我们就可以更好地了解您要做什么。我的直觉反应是,您应该能够在单个insert into table2 select ...
语句中执行此操作 - 无需逐行处理,也就是逐个缓慢处理!
您在寻找分层查询吗?尝试搜索 CONNECT BY
- 这就是您要查找的内容吗?
我编辑了我的帖子,希望现在描述得更好..
【参考方案1】:
从您的问题看来,您似乎想将所有 id 插入 table2 中,这对于基于列 "column" 的 table1 和 table2 来说都是常见的。并省略其余没有共同点的行。
这意味着你希望 table2 包含 table2 intersect table1(对于列“column”)
现在在 sql 中你可以很容易地做到这一点,因为它涉及到集合操作而不是在单行上操作。
假设你的 table1 是
id 列
1 个“A”
2“B”
3“C”
table2 是
id 列
3“A”
4“C”
然后在table2中你要插入
1 -- 因为 "A" 并且在 table1 中有 id 1 和
3 -- 因为 "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
【讨论】:
所以你想从输入中插入 id,即 table3 到 table4 中,前提是它有一个父级,你可以通过查看 table2 来检查。请告诉我我的理解是否正确。我也是 table2 的示例, column3 是 parent 的 id,column1 是行本身的 id 吗? 是的,就像你说的那样, 所以在这种情况下 2345 1 0 , 5346 2 0 , 23432 6 0 不应该被插入,因为它们没有作为 column3 = 0 的父级并且行 34234 8 0 , 67867 9 9 不应该被插入因为它们不是 input 的一部分。我在吗? 类似的东西,但请记住,作为 INPUT,我只有 4 个 ID:1、2、3、4(要插入的表格)。这就是我所拥有的,我必须从那张桌子开始。 让我再问一件事。在您的 table2 示例中, 1 、 2 、 3 、 4 被插入,因为它们在 input 中并且它们有 parent 。因为 3 的父级是 6 ,所以也插入了 6 。由于 4 的父级是 7 ,因此也插入了 7 ,并且由于 7 的父级是 9 ,因此也插入了 9 。是这样吗?【参考方案2】:把它变成insert into .. select from
喜欢
insert into table2(id)
Select id from table1 t1 join table2 t2 on t1.column=t2.column2
【讨论】:
我不明白,“等等,直到select不会返回任何东西。”,我不确定select会返回多少次,有时可能是3次,有时是30次...我想到了一个游标循环,但问题是如何自动化它,我应该以某种方式将“选择语句”放入变量中吗?以上是关于从循环/选择语句中插入表值作为变量的主要内容,如果未能解决你的问题,请参考以下文章