在以下代码中:
SELECT ... FROM ... CROSS JOIN TABLE ... WHERE ...;
Run Code Online (Sandbox Code Playgroud)
CROSS JOIN TABLE是什么意思?
我在网上搜索,但我只能找到CROSS JOIN.
我想CROSS JOIN TABLE作用于一个表,意思是这样的表:
CREATE OR REPLACE ... AS TABLE OF ...;
Run Code Online (Sandbox Code Playgroud)
这是完整的查询:
SELECT prog.id_oct_prog_tran_a_participati, prog.code_ressource, prog.instant_depart, prog.commentaire, prog.en_hors_economie_de_comb, discr.delai, discr.valeur_point, MOD(delai, 60) AS H24
FROM req_prog prog
CROSS JOIN TABLE(POINTS_DISCRETS(pIdChronique=>id_chr_substitution)) discr
WHERE horizon <= 'J1'
AND delai > 0
ORDER BY id_oct_prog_tran_a_participati, instant_depart, horizon, delai
Run Code Online (Sandbox Code Playgroud)
POINTS_DISCRETS
是一个返回类型元素的函数TYPE_TAB_POINT
.并且TYPE_TAB_POINT
是DBA创建的类型如下:
create or replace TYPE "TYPE_TAB_POINT" AS TABLE OF TYPE_POINT;
Run Code Online (Sandbox Code Playgroud)
TYPE_POINT
创建的类型在哪里:
create or replace TYPE "TYPE_POINT" AS OBJECT
(
ID_CHRONIQUE NUMBER,
HORIZON VARCHAR2(2),
NUM_POINT NUMBER(4),
DELAI NUMBER(5),
VALEUR_POINT FLOAT
);
Run Code Online (Sandbox Code Playgroud)
所以,正如你在这里看到的那样,CROSS JOIN TABLE
作用于表而不是我们通常在数据库中表示的表,更像是像数组一样的表.
是这样的吗?而且,如果是的话,它怎么能被视为真正的桌子呢?
你错误地解析了这个陈述,这让我觉得很困惑.CROSS JOIN TABLE
不是一个片段; 它是CROSS JOIN
真实表之间的(但可以是任何连接类型),req_prog
并且分别TABLE(...)
告诉查询将函数调用的返回值视为表.
TABLE(...)
是表集合表达式:
table_collection_expression允许您通知Oracle,应将collection_expression的值视为表,以便进行查询和DML操作.collection_expression可以是子查询,列,函数或集合构造函数.
这POINTS_DISCRETS
是集合构造函数 - 返回TYPE_TAB_POINT
,这是一个集合,其中大部分都是你已经想到的.
在这种情况下,您的集合是一个对象表,并将其视为一个表允许您连接和引用形成每个"行"的对象的属性,就像它是一个列一样.将TABLE()
被作为别名discr
,所以你能指discr.delai
-其中delai
是属性的一个TYPE_POINT
类型.如果您使用的是内部或外部连接,而不是交叉连接,则可以在连接条件中使用相同的结构,例如ON discr.x = prog.x
.应用表集合表达式后,您只需将其视为表单其余部分中的表.