从循环/选择语句中插入表值作为变量

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次...我想到了一个游标循环,但问题是如何自动化它,我应该以某种方式将“选择语句”放入变量中吗?

以上是关于从循环/选择语句中插入表值作为变量的主要内容,如果未能解决你的问题,请参考以下文章

在 for 循环中选择语句

在 for 循环中使用 case 语句选择变量

循环与选择

如何从组合框选择中选择表值?

mysql 存储过程中 查询语句后面的from加上变量名 怎么写

Entity Framework 的 FromSql 方法执行使用内部连接选择语句的 SQL Server 表值函数