在查询中使用table()连接两个记录集

时间:2015-11-02 12:02:44

标签: sql oracle

我试图用SQL查询两种类型。

类型创建如下:

create or replace type MYCOLLSTRING is table of varchar2(4000)

现在我有两个这种类型的PL / SQL集合:

declare
    col1 MYCOLLSTRING;
    col2 MYCOLLSTRING;
begin
    col1 := MYCOLLSTRING();
    col2 := MYCOLLSTRING();
    col1.extend();
    col1(col1.last) := 'Test1';
    col1.extend();
    col1(col1.last) := 'Test2';
    col2.extend();
    col2(col2.last) := 'Test3';
    col2.extend();
    col2(col2.last) := 'Test4';
    --collections prepared

    select   *
    from     table(col1) x,
             table(col2) y;
    --here i'm trying to join x and y using their collection key
end;

正如您在查询中看到的那样,我尝试通过记录集键加入两个结果。截至目前,唱片集没有字段名称,因此我现在也不知道如何加入他们的价值观。

我很感激你的意见!

2 个答案:

答案 0 :(得分:3)

默认字段为COLUMN_VALUE。应该是这样的:

select   *
from     table(col1) x,
         table(col2) y
where    x.COLUMN_VALUE = y.COLUMN_VALUE;

答案 1 :(得分:1)

集合中有一个索引,但您只能在PL / SQL上下文中引用它。

for i in 1..col1.count loop
  dbms_output.put_line(i || ': ' || col1(i) || ', ' || col2(i));
end loop;

在SQL查询中,您可以根据每个集合中的行号生成伪密钥。你需要选择一些东西,如果你想要两个列,你需要一个不同的集合类型;对于这个例子,我已经声明了一个记录类型和一个这种类型的表:

declare
    type rec_type is record (c1 varchar2(4000), c2 varchar2(4000));
    type rec_table_type is table of rec_type;
    col1 MYCOLLSTRING;
    col2 MYCOLLSTRING;
    col3 rec_table_type;
begin
    ...
    select   x.column_value, y.column_value
    bulk collect into col3
    from     (select rownum as column_key, column_value from table(col1)) x
    join     (select rownum as column_key, column_value from table(col2)) y
    on       y.column_key = x.column_key;
    --here i'm trying to join x and y using their collection key    

    for i in 1..col3.count loop
        dbms_output.put_line(i || ': ' || col3(i).c1 || ', ' || col3(i).c2);
    end loop;
end;
/

PL/SQL procedure successfully completed.

1: Test1, Test3
2: Test2, Test4

当然,假设基本集合具有相同数量的元素;你可以使用外连接来修复它,如果没有。根据你正在做的事情,你可能实际上并不需要第三个集合,并且可以使用游标来进行连接并使用它的结果:

    for r in (
        select   x.column_value c1, y.column_value c2
        from     (select rownum as column_key, column_value from table(col1)) x
        join     (select rownum as column_key, column_value from table(col2)) y
        on       y.column_key = x.column_key
    ) loop
        dbms_output.put_line(r.c1 || ', ' || r.c2);
    end loop;
end;
/

PL/SQL procedure successfully completed.

Test1, Test3
Test2, Test4

如果你确实需要第三个集合,你可以将它们组合起来填充它,而不需要SQL上下文切换:

    col3 := rec_table_type();
    for i in 1..col1.count loop
        col3.extend;
        col3(i).c1 := col1(i);
        col3(i).c2 := col2(i);
    end loop;

    for i in 1..col3.count loop
        dbms_output.put_line(i || ': ' || col3(i).c1 || ', ' || col3(i).c2);
    end loop;
end;
/

PL/SQL procedure successfully completed.

1: Test1, Test3
2: Test2, Test4

这仍假设集合大小相同。如果不是,你可以得到下标错误;您可以在每个元素引用之前测试大小,或者通过用较小的元素填充较小的元素来强制它们具有相同的大小。