CROSS JOIN和CROSS JOIN TABLE有什么区别

hyd*_*tza 0 sql oracle join

在以下代码中:

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作用于表而不是我们通常在数据库中表示的表,更像是像数组一样的表.

是这样的吗?而且,如果是的话,它怎么能被视为真正的桌子呢?

Ale*_*ole 6

你错误地解析了这个陈述,这让我觉得很困惑.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.应用表集合表达式后,您只需将其视为表单其余部分中的表.