我有一个带有收集类型的表。我SELECT要从表和GROUP BY某些列开始。我希望每个组的结果都包含一个集合,该集合包含该组中所有单个集合的独特联合。
SELECT
GROUP BY
例如,
CREATE OR REPLACE TYPE my_varchar2_list AS TABLE OF VARCHAR2 (80); WITH test_data (id, a_list) AS (SELECT 1, NEW my_varchar2_list ('A', 'B', 'C') FROM DUAL UNION ALL SELECT 1, NEW my_varchar2_list ('C', 'D', 'E') FROM DUAL) SELECT id, ... some magic syntax here... FROM test_data GROUP BY id Desired results: 1, ('A','B','C','D','E')
我只在寻找可以插入上方“神奇的语法在这里”占位符的表达式。我知道我可以通过加入TABLE(a_list)主表或以其他方式重组查询(或当然使用PL / SQL)来完成聚合。但是,我现在暂时避免这样的解决方案。
TABLE(a_list)
Oracle安装程序 :
CREATE OR REPLACE TYPE VARCHAR2s_Table IS TABLE OF VARCHAR2(100); /
创建用户定义的聚合类型:
CREATE OR REPLACE TYPE Varchar2sTableUnion AS OBJECT( list VARCHAR2s_Table, STATIC FUNCTION ODCIAggregateInitialize( ctx IN OUT Varchar2sTableUnion ) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateIterate( self IN OUT Varchar2sTableUnion, value IN VARCHAR2s_Table ) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateTerminate( self IN OUT Varchar2sTableUnion, returnValue OUT VARCHAR2s_Table, flags IN NUMBER ) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateMerge( self IN OUT Varchar2sTableUnion, ctx IN OUT Varchar2sTableUnion ) RETURN NUMBER ); / CREATE OR REPLACE TYPE BODY Varchar2sTableUnion IS STATIC FUNCTION ODCIAggregateInitialize( ctx IN OUT Varchar2sTableUnion ) RETURN NUMBER IS BEGIN ctx := Varchar2sTableUnion( NULL ); RETURN ODCIConst.SUCCESS; END; MEMBER FUNCTION ODCIAggregateIterate( self IN OUT Varchar2sTableUnion, value IN VARCHAR2s_Table ) RETURN NUMBER IS BEGIN IF value IS NULL THEN NULL; ELSIF self.list IS NULL THEN self.list := value; ELSE self.list := self.list MULTISET UNION DISTINCT value; END IF; RETURN ODCIConst.SUCCESS; END; MEMBER FUNCTION ODCIAggregateTerminate( self IN OUT Varchar2sTableUnion, returnValue OUT VARCHAR2s_Table, flags IN NUMBER ) RETURN NUMBER IS BEGIN returnValue := self.list; RETURN ODCIConst.SUCCESS; END; MEMBER FUNCTION ODCIAggregateMerge( self IN OUT Varchar2sTableUnion, ctx IN OUT Varchar2sTableUnion ) RETURN NUMBER IS BEGIN IF self.list IS NULL THEN self.list := ctx.list; ELSIF ctx.list IS NULL THEN NULL; ELSE self.list := self.list MULTISET UNION DISTINCT ctx.list; END IF; RETURN ODCIConst.SUCCESS; END; END; /
创建一个用户定义的聚合函数:
CREATE FUNCTION MULTISET_UNION( list VARCHAR2s_Table ) RETURN VARCHAR2s_Table PARALLEL_ENABLE AGGREGATE USING Varchar2sTableUnion; /
查询 :
然后,您可以使用它在查询中执行聚合:
WITH test_data (id, a_list) AS (SELECT 1, varchar2s_table ('A', 'B', 'C') FROM DUAL UNION ALL SELECT 1, varchar2s_table ('C', 'D', 'E') FROM DUAL) SELECT id, MULTISET_UNION( a_list ) FROM test_data GROUP BY id
输出 :
ID MULTISET_UNION(A_LIST) -- ------------------------------------------- 1 SCHEMA.VARCHAR2S_TABLE('A','B','C','D','E')