CROSS JOIN和CROSS JOIN TABLE

时间:2015-08-17 13:22:48

标签: sql oracle join

在以下代码中:

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作用于一个表而不是一个表,就像我们在数据库中通常所说的那样,更像是一个像数组一样的表。

是这样的吗?并且,如果是,它如何被视为真正的表?

1 个答案:

答案 0 :(得分:6)

您正在错误地解析语句,这让我感到困惑。 CROSS JOIN TABLE不是一个片段;它是真实表CROSS JOINreq_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 - 其中delaiTYPE_POINT类型的属性之一。如果使用内部或外部连接而不是交叉连接,则在连接条件中使用相同的结构,例如ON discr.x = prog.x。应用表集合表达式后,您只需将其视为表单其余部分中的表。