Oracle交叉连接表对象无需Table()函数传播行的原因咨询
Oracle Spatial使用疑问:表集合交叉连接时TABLE()函数非必需的原因
Oracle Spatial提供SDO_UTIL.GETVERTICES函数:
该函数返回
MDSYS.VERTEX_SET_TYPE类型对象,本质是由MDSYS.VERTEX_TYPE对象构成的嵌套表集合,类型定义如下:CREATE TYPE vertex_set_type as TABLE OF vertex_type;
常规开发实践中,GetVertices()一般和TABLE()函数搭配使用:将几何数据表与table(getvertices(shape))做交叉连接,就能为每个几何对象拆分出对应的所有顶点行,示例代码如下:
with cte as ( select sdo_geometry('linestring (10 20, 30 40)') shape from dual union all select sdo_geometry('linestring (50 60, 70 80, 90 100)') shape from dual union all select sdo_geometry('linestring (110 120, 130 140, 150 160, 170 180)') shape from dual) select v.* from cte, table(sdo_util.getvertices(shape)) v
查询返回结果:
X Y Z W V5 V6 V7 V8 V9 V10 V11 ID ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- 10 20 1 30 40 2 50 60 1 70 80 2 90 100 3 110 120 1 130 140 2 150 160 3 170 180 4
Oracle官方文档给出的示例同样推荐使用TABLE()函数。
但实际测试发现TABLE()函数并不是必需的:把查询里的TABLE()去掉之后,返回的结果和原写法完全一致。
待确认问题
- 和表类型对象做交叉连接时,为什么不写
TABLE()函数也能实现集合拆分为多行的效果? - 官方文档明确提示需要使用
TABLE()函数,是不是旧版本Oracle强制要求必须加该函数,新版本对语法规则做了调整?
相关参考方向
- TABLE关键字针对表集合表达式变为可选项的起始版本说明
- 不使用Table()表达式交叉连接varray的实现方案
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

