【问题标题】:What is the difference between CROSS JOIN and CROSS JOIN TABLECROSS JOIN 和 CROSS JOIN TABLE 有什么区别
【发布时间】:2015-08-17 22:07:57
【问题描述】:

在以下代码中:

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

是这样吗?而且,如果是的话,它怎么能被认为是一个真正的表?

【问题讨论】:

  • 请发布我们的完整查询?
  • 我编辑了我的问题。有什么想法吗?
  • 不是cross join table,而是带有table(..) 表达式的cross join

标签: sql oracle join


【解决方案1】:

您对语句的解析不正确,我认为这让您感到困惑。 CROSS JOIN TABLE 不是一个片段;它是真实表 req_progTABLE(...) 之间的CROSS JOIN(但可以是任何连接类型),分别告诉查询将函数调用的返回值视为表。

TABLE(...)table collection expression

table_collection_expression 让您通知 Oracle,collection_expression 的值应被视为一个表,以用于查询和 DML 操作。 collection_expression 可以是子查询、列、函数或集合构造函数。

这里POINTS_DISCRETS是集合构造函数——返回TYPE_TAB_POINT,这是一个集合,其中大部分你已经弄清楚了。

在这种情况下,您的集合是一个对象表,将其视为一个表允许您连接和引用形成每个“行”的对象的属性,就好像它是一列一样。 TABLE() 别名为discr,因此您可以引用discr.delai - 其中delaiTYPE_POINT 类型的属性之一。如果您使用的是内连接或外连接,而不是交叉连接,您将在连接条件中使用相同的结构,例如ON discr.x = prog.x。应用表集合表达式后,您只需在语句的其余部分将其视为表。

【讨论】:

  • 谢谢,完全明白了!
猜你喜欢
  • 2016-09-05
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
相关资源
最近更新 更多