java.sql.Types.ARRAY 来自简单的 select 语句
java.sql.Types.ARRAY from simple select statement
我有:
- Table "CI",这里有很多栏目,ci_id,描述,...
- Table "CI_REL", ci_id, parent_ci_id, child_ci_id
- CI_REL中有多个关系,表示CI中的一条记录有多个parents,或CI中有多个children记录
我需要的:
连接两个表,所以我得到一条 CI 的记录,该记录中的 parents 和 children 包含一个 Sql ARRAY(VARRAY?) .
示例:
|id | description | children | parents |
|1 | root | [2,3] | null |
|2 | child1 | [3] | [1] |
|3 | child2 | [2] | [1] |
为什么我需要这个?我正在使用 Apache Nifi 将数据摄取到 Apache Solr 中,并且需要 children 和 parents 的多值字段。由于 ExecuteSQL 正在解释 sql 结果集,并以我需要的方式查找 java.sql.Types.ARRAY,因此我想要一个 select,实际上是 returns,不知何故。顺便说一句:我没有任何可能使用 PL/SQL,希望这不会使答案变得不可能...
谢谢!
亨宁
您可以在相关子查询中使用 CAST( COLLECT( ... ) AS ... )
生成您的集合:
Oracle 11g R2 架构设置:
CREATE TABLE CI ( id, description ) AS
SELECT 1, 'root' FROM DUAL UNION ALL
SELECT 2, 'child1' FROM DUAL UNION ALL
SELECT 3, 'child2' FROM DUAL;
CREATE TABLE CI_REL ( ci_id, child_ci_id, parent_ci_id ) AS
SELECT 1, 2, NULL FROM DUAL UNION ALL
SELECT 2, 3, 1 FROM DUAL UNION ALL
SELECT 3, NULL, 2 FROM DUAL;
CREATE TYPE NumberList IS TABLE OF Number(8,0);
查询 1:
SELECT c.*,
( SELECT CAST(
COLLECT(
DISTINCT child_ci_id
ORDER BY LEVEL
) AS NumberList
)
FROM CI_REL r
WHERE child_ci_id IS NOT NULL
START WITH r.ci_id = c.id
CONNECT BY PRIOR child_ci_id = ci_id
) AS children,
( SELECT CAST(
COLLECT(
DISTINCT parent_ci_id
ORDER BY LEVEL
) AS NumberList
)
FROM CI_REL r
WHERE parent_ci_id IS NOT NULL
START WITH r.ci_id = c.id
CONNECT BY PRIOR parent_ci_id = ci_id
) AS parents
FROM CI c
| ID | DESCRIPTION | CHILDREN | PARENTS |
|----|-------------|----------|---------|
| 1 | root | 2,3 | |
| 2 | child1 | 3 | 1 |
| 3 | child2 | | 2,1 |
我有:
- Table "CI",这里有很多栏目,ci_id,描述,...
- Table "CI_REL", ci_id, parent_ci_id, child_ci_id
- CI_REL中有多个关系,表示CI中的一条记录有多个parents,或CI中有多个children记录
我需要的:
连接两个表,所以我得到一条 CI 的记录,该记录中的 parents 和 children 包含一个 Sql ARRAY(VARRAY?) .
示例:
|id | description | children | parents |
|1 | root | [2,3] | null |
|2 | child1 | [3] | [1] |
|3 | child2 | [2] | [1] |
为什么我需要这个?我正在使用 Apache Nifi 将数据摄取到 Apache Solr 中,并且需要 children 和 parents 的多值字段。由于 ExecuteSQL 正在解释 sql 结果集,并以我需要的方式查找 java.sql.Types.ARRAY,因此我想要一个 select,实际上是 returns,不知何故。顺便说一句:我没有任何可能使用 PL/SQL,希望这不会使答案变得不可能...
谢谢! 亨宁
您可以在相关子查询中使用 CAST( COLLECT( ... ) AS ... )
生成您的集合:
Oracle 11g R2 架构设置:
CREATE TABLE CI ( id, description ) AS
SELECT 1, 'root' FROM DUAL UNION ALL
SELECT 2, 'child1' FROM DUAL UNION ALL
SELECT 3, 'child2' FROM DUAL;
CREATE TABLE CI_REL ( ci_id, child_ci_id, parent_ci_id ) AS
SELECT 1, 2, NULL FROM DUAL UNION ALL
SELECT 2, 3, 1 FROM DUAL UNION ALL
SELECT 3, NULL, 2 FROM DUAL;
CREATE TYPE NumberList IS TABLE OF Number(8,0);
查询 1:
SELECT c.*,
( SELECT CAST(
COLLECT(
DISTINCT child_ci_id
ORDER BY LEVEL
) AS NumberList
)
FROM CI_REL r
WHERE child_ci_id IS NOT NULL
START WITH r.ci_id = c.id
CONNECT BY PRIOR child_ci_id = ci_id
) AS children,
( SELECT CAST(
COLLECT(
DISTINCT parent_ci_id
ORDER BY LEVEL
) AS NumberList
)
FROM CI_REL r
WHERE parent_ci_id IS NOT NULL
START WITH r.ci_id = c.id
CONNECT BY PRIOR parent_ci_id = ci_id
) AS parents
FROM CI c
| ID | DESCRIPTION | CHILDREN | PARENTS |
|----|-------------|----------|---------|
| 1 | root | 2,3 | |
| 2 | child1 | 3 | 1 |
| 3 | child2 | | 2,1 |