oracle交叉连接在同一个表上

时间:2015-05-06 15:27:28

标签: sql oracle join

我在Oracle数据库中有一个表,它有很多记录。该表有一个“类型”列,指定每个记录的类型。我想做不同类型的交叉连接记录。

假设此表为“RecordTypes”

Name    Type    Group
1name1  1   1
1name2  1   1
2name1  2   1
2name2  2   2
3name1  3   3
3name2  3   3

我希望查询根据Type列交叉连接此表的行。在此表中,有3种类型的记录基于“类型”列。查询应该产生这个结果。

Type1   Type2   Type3
1name1  2name1  3name1
1name1  2name1  3name2
1name1  2name2  3name1
1name1  2name2  3name2
1name2  2name1  3name1
1name2  2name1  3name2
1name2  2name2  3name1
1name2  2name2  3name2

我可以根据此查询生成此结果,但我已经硬编码了类型值。实时地,我不知道“类型”列的具有多少不同的值。

With type1 as (select name from table where type = 1),
Type2 as (select name from table where type = 2),
Type3 as (select name from table where type = 3)
Select * from type1, type2, type3.

我想要一个查询/存储过程来返回结果,其中存储过程应该找到可用的不同类型值并返回上面的结果。此外,从结果中我需要在一行中的2个或更多列属于同一“组”时删除记录。

1 个答案:

答案 0 :(得分:0)

您可以动态构建一个类似于以下内容的查询:

CREATE OR REPLACE FUNCTION SOME_PROC()
  RETURNS VARCHAR2
IS
  strQuery   VARCHAR2(32767) := 'WITH ';
  strTables  VARCHAR2(32767);
  c          SYSREFCURSOR;
BEGIN
  FOR aRow IN (SELECT DISTINCT TYPE FROM RECORDTYPES)
  LOOP
    strQuery := strQuery || 'TYPE' || aRow.TYPE ||
                ' AS (SELECT NAME FROM SOME_TABLE WHERE TYPE = ' ||
                aRow.TYPE || '),';

    strTables := strTables || 'TYPE' || aRow.TYPE || ',';
  END LOOP;

  strQuery := RTRIM(strQuery, ',') ||  -- remove trailing comma
              ' SELECT * FROM ' ||
              RTRIM(strTables, ',');   -- remove trailing comma

  RETURN strQuery;
END SOME_PROC;

要使用,请调用此函数以获取查询的文本,然后调用代码可以执行查询并执行处理它所需的任何操作。

所有纯粹脱离我的头顶,没有在动物身上测试过,你会成为第一个! : - )

分享并享受。