在以下代码中:
SELECT ... FROM ... CROSS JOIN TABLE ... WHERE ...;
CROSS JOIN TABLE是什么意思?
我在网上搜索,但我能找到的只是关于CROSS JOIN。
我认为CROSS JOIN TABLE作用于一个表,意思是这样的表:
CREATE OR REPLACE ... AS TABLE OF ...;
以下是完整查询:
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
POINTS_DISCRETS
是一个返回TYPE_TAB_POINT
类型元素的函数。 TYPE_TAB_POINT
是DBA创建的类型:
create or replace TYPE "TYPE_TAB_POINT" AS TABLE OF TYPE_POINT;
其中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
);
所以,正如你在这里看到的那样,CROSS JOIN TABLE
作用于一个表而不是一个表,就像我们在数据库中通常所说的那样,更像是一个像数组一样的表。
是这样的吗?并且,如果是,它如何被视为真正的表?
答案 0 :(得分:6)
您正在错误地解析语句,这让我感到困惑。 CROSS JOIN TABLE
不是一个片段;它是真实表CROSS JOIN
和req_prog
之间的TABLE(...)
(但可以是任何连接类型),以告诉查询将函数调用的返回值视为一张桌子。
TABLE(...)
是table collection expression:
table_collection_expression允许您通知Oracle,应将collection_expression的值视为表,以便进行查询和DML操作。 collection_expression可以是子查询,列,函数或集合构造函数。
此处POINTS_DISCRETS
是集合构造函数 - 返回TYPE_TAB_POINT
,这是一个集合,其中大部分是您已经想到的。
在这种情况下,您的集合是一个对象表,并将其视为一个表,这样您就可以加入并引用形成每个行的对象的属性&#39;好像它是一个专栏。 TABLE()
的别名为discr
,因此您可以引用discr.delai
- 其中delai
是TYPE_POINT
类型的属性之一。如果使用内部或外部连接而不是交叉连接,则在连接条件中使用相同的结构,例如ON discr.x = prog.x
。应用表集合表达式后,您只需将其视为表单其余部分中的表。