如何在 Oracle SQL 查询中将一行与该行内的数组连接起来
How can I join a row with an arrays inside that row in an Oracle SQL query
我有一些这样声明的自定义 oracle 类型:
create type S_TYPE as table of VARCHAR2(4000);
CREATE TYPE "OBJ_ORDER_ADD" AS object (
ADD_TYPE NUMBER,
ADDITION s_type
-- other fields not represented here for brevity
);
create type ARRAY_ORDER_ADD as table of OBJ_ORDER_ADD;
这意味着我可以创建如下所示的 ARRAY_ORDER_ADD
实例:
add_type | addition
---------------------
10 | ['a', 'b']
20 | ['x', 'y', 'z']
我需要创建 FUNCTION
,它可以将包含的数据合并到相应的 order_add
table,其中 addition
列是 VARCHAR
。将上面的对象合并成空 table 后,我希望 table 包含:
add_type | addition
-------------------
10 | 'a'
10 | 'b'
20 | 'x'
20 | 'y'
20 | 'z'
我知道我可以使用一个带有两个嵌套循环的简单解决方案来实现这一点,但是这个解决方案会导致很多 SQL/PLSQL 上下文切换,我想避免它们。
我的理想目标是使用单个 MERGE
查询来完成此操作。
这可能吗?
我尝试了 SELECT ... FROM TABLE(myRecord)
的几种组合,并尝试以某种方式用 TABLE(myRecord.addition)
对每条记录进行笛卡尔积,但我似乎无法将它们正确地组合在一起。
我不太确定您的实际实现是什么,但这向您展示了如何在纯 SQL 中取消嵌套嵌套的 table。
WITH 子句创建样本数据的集合,然后我们使用连续的 table()
函数解压嵌套的 table 对象:
with cte as (
select ARRAY_ORDER_ADD(OBJ_ORDER_ADD(10, s_type('a', 'b'))
, OBJ_ORDER_ADD(20, s_type('a', 'b', 'c'))) as nt
from dual
)
select t.add_type
, x.column_value as s_type_element
from cte
, table(cte.nt) t
, table(t.addition) x;
我有一些这样声明的自定义 oracle 类型:
create type S_TYPE as table of VARCHAR2(4000);
CREATE TYPE "OBJ_ORDER_ADD" AS object (
ADD_TYPE NUMBER,
ADDITION s_type
-- other fields not represented here for brevity
);
create type ARRAY_ORDER_ADD as table of OBJ_ORDER_ADD;
这意味着我可以创建如下所示的 ARRAY_ORDER_ADD
实例:
add_type | addition
---------------------
10 | ['a', 'b']
20 | ['x', 'y', 'z']
我需要创建 FUNCTION
,它可以将包含的数据合并到相应的 order_add
table,其中 addition
列是 VARCHAR
。将上面的对象合并成空 table 后,我希望 table 包含:
add_type | addition
-------------------
10 | 'a'
10 | 'b'
20 | 'x'
20 | 'y'
20 | 'z'
我知道我可以使用一个带有两个嵌套循环的简单解决方案来实现这一点,但是这个解决方案会导致很多 SQL/PLSQL 上下文切换,我想避免它们。
我的理想目标是使用单个 MERGE
查询来完成此操作。
这可能吗?
我尝试了 SELECT ... FROM TABLE(myRecord)
的几种组合,并尝试以某种方式用 TABLE(myRecord.addition)
对每条记录进行笛卡尔积,但我似乎无法将它们正确地组合在一起。
我不太确定您的实际实现是什么,但这向您展示了如何在纯 SQL 中取消嵌套嵌套的 table。
WITH 子句创建样本数据的集合,然后我们使用连续的 table()
函数解压嵌套的 table 对象:
with cte as (
select ARRAY_ORDER_ADD(OBJ_ORDER_ADD(10, s_type('a', 'b'))
, OBJ_ORDER_ADD(20, s_type('a', 'b', 'c'))) as nt
from dual
)
select t.add_type
, x.column_value as s_type_element
from cte
, table(cte.nt) t
, table(t.addition) x;