我在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个或更多列属于同一“组”时删除记录。
答案 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;
要使用,请调用此函数以获取查询的文本,然后调用代码可以执行查询并执行处理它所需的任何操作。
所有纯粹脱离我的头顶,没有在动物身上测试过,你会成为第一个! : - )
分享并享受。