oracle中MODEL子句的再探

model的语法以下:数组

MODEL
[<global reference options>]
[<reference models>]
[MAIN <main-name>]
  [PARTITION BY (<cols>)]
  DIMENSION BY (<cols>)
  MEASURES (<cols>)
  [<reference options>]
  [RULES]  <rule options>
  (<rule>, <rule>,.., <rule>)

  <global reference options> ::= <reference options> <ret-opt>
   <ret-opt> ::= RETURN {ALL|UPDATED} ROWS
  <reference options> ::=
  [IGNORE NAV | [KEEP NAV]
  [UNIQUE DIMENSION | UNIQUE SINGLE REFERENCE]
  <rule options> ::=
  [UPDATE | UPSERT | UPSERT ALL]
  [AUTOMATIC ORDER | SEQUENTIAL ORDER]
  [ITERATE (<number>)  [UNTIL <condition>]]
  <reference models> ::= REFERENCE ON <ref-name> ON (<query>)
  DIMENSION BY (<cols>) MEASURES (<cols>) <reference options>

先解释一下关键字:
MODEL 标示字。
RETURN {ALL|UPDATED} ROWS 返回的结果集是否只包含修改或新增的记录,默认是ALL。
MAIN 当有引用子MODEL时,标示如下条件是主MODEL的条件。
PARTITION BY 按参数中的列分组,以后的运算都是分组进行的;参数能够是表达式,可是必须有别名。
DIMENSION BY 声明各分组中的维度字段,至关于多维键值对的建,字段值即键;参数能够是表达式,可是必须有别名。
MEASURES 声明各分组中的指标字段,即键值对中的值;参数能够是表达式,可是必须有别名。
IGNORE NAV|KEEP NAV 替换null|保留null,0替换数组,空格替换字符,01-JAN-2001 替换日期,null替换其余,默认是KEEP NAV 。
UNIQUE DIMENSION|UNIQUE SINGLE REFERENCE 组内维度惟一|右侧引用惟一,默认是UNIQUE DIMENSION,右侧引用惟一的另外一个区别是可能更新多个单元,由于左侧单元可能不惟一。
RULES [UPDATE|UPSERT|UPSERT ALL] 指标计算规则,更新|更新和简单插入|更新和复杂插入,默认是UPSERT
AUTOMATIC ORDER|SEQUENTIAL ORDER 指标计算的顺序,逻辑依赖顺序|书写顺序,默认是SEQUENTIAL ORDER 。
ITERALTE(N) [UNTIL(C)] 重复N次的计算,直到知足C的条件退出。
REFERENCE name ON (select子句) 维度、指标定义,内嵌子MODEL,主MODEL中使用name引用。函数

UPDATE 只更新已有单元,不存在则无效果。
UPSERT 在上面的基础上,若是左侧单元是以位置引用的话,则不存在就插入;FOR也是位置引用,可是更新的单元为FOR列表和其余维度的交叉乘集;左侧单元使用ANY引用,不会产生新单元,ANY的意思是IS NULL OR IS NOT NULL。
UPSERT ALL 在上面的基础上,左侧单元可使用IN,ANY等谓词。spa

UPSERT的执行过程:
一、找出左侧单元的逻辑引用,谓词也是逻辑引用。
二、计算出逻辑引用的笛卡尔积集合。
三、和位置引用一块儿得出须要运算的单元集。
四、根据RULE规则更新或新增记录。it

指标运算:
可使用自带的一些函数,当前维度值可使用CV(),只能用在单元引用,若是是外面则必须加上维度名。
维度为ANY、FOR、BETWEEN等时,能够在单元后面加上ORDER BY 维度名,固定单元计算的顺序。
右侧表达式能够有分析函数,聚合函数等。
 io

相关文章
相关标签/搜索