跳转至

Aloudata AIR 支持创建三种视图,分别为普通视图,参数化视图和方言视图。

CREATE VIEW

构建普通视图。

  • 功能描述

创建一个SELECT查询的新视图。视图是一个逻辑表,可以被后续查询引用。当视图没有被加速时,视图本身不存储任何数据。相反,每次通过其他查询引用视图时,存储在视图中的查询都会被执行。

可选的“OR REPLACE”子句会在视图已经存在时替换老的视图,而不是抛出错误。

  • 语法说明
CREATE [ OR REPLACE ] VIEW view_name
AS {query}
  • 常见用法
CREATE VIEW test AS
SELECT orderkey, orderstatus, totalprice / 2 AS half
FROM orders
CREATE OR REPLACE VIEW test AS
SELECT orderkey, orderstatus, totalprice / 4 AS quarter
FROM orders

PARAMETER VIEW

自Aloudata AIR 2.16 后支持

Aloudata AIR 自2.16开始支持够构建参数化视图。参数化视图是在普通视图的基础上,允许构建视图的时候使用参数。参数的声明使用@的方式。具体语法如下:

  • 语法说明
CREATE [OR REPLACE] VIEW <catalogPath>.<schemaPath>.<viewPath> 
AS
  {QUERY} 
USING PARAMETERS (
  <paramName> <type> <defaultValue>,
  [<paramName> <type> <defaultValue>...]
)

<catalogPath>.<schemaPath>.<viewPath>: 为创建参数化视图的路径

QUERY: 为一条带有参数的查询语句。比如构建一个查询,查询条件为某一个列的值大于一个值,这个值为参数,参数名为param,则构建的查询为: SELECT * FROM table WHERE columnName > @param, 此时@param 为声明在查询中的变量。后续查询这个视图的时候,需要这个参数具体的值。参数赋值方式在后文会详细说明。

paramName: 声明的参数名。

type: Aloudata AIR 支持的数据类型。请参考:函数列表中的数据类型章节。

defaultValue: 当前参数默认值,如果查询参数化视图没有改该参数赋值,则会使用默认参数;如果没有设置默认值,并且查询参数化视图的时候没有给该参数赋值,则会报错。

  • 参数化视图构建
CREATE VIEW catalogName.schemaName.paramView1 
AS 
select *, @paramA 
from table 
where columnA = @paramA 
  and columnB > @paramB 
  and YEAR(columnC) = YEAR(@paramC)
USING PARAMETERS (
  paramA varchar, -- paramA的参数类型为varchar, 没有默认值
  paramB integer 10, -- paramB的参数类型为integer, 默认值为10
  paramC date '2025-04-01' -- paramC的参数类型为date, 默认值为 '2025-04-01', 这里的默认值也可以写成 Date '2025-04-01'
)

在这个案例中,构建了一个参数化视图,路径为catalogName.schemaName.paramView1。 查询语句为select *, @paramA from table where columnA = @paramA and columnB > @paramB and YEAR(columnC) = YEAR(@paramC)。 这条查询语句中,声明了三个参数,分别为paramA, paramB, paramC, 通过@ 符号来标识该值为参数。参数的声明可以出现在查询语句的任何地方,把它当作查询中的常量占位符即可。USING PARAMETER 声明了以上三个参数的的类型和默认值。默认值可以给出,也可以不给。

  • 参数化视图的查询与参数赋值

参数化视图的参数赋值,有两种方式:1. 对于一条普通的不包含join的查询,赋值方式通过WHERE 子句的 ‘= ’ 或者IN 条件赋值;2. 对于包含join的查询,赋值方式通过ON后面的'=' 或者IN 条件 赋值。

先介绍第一种, 对于一条普通的不包含join的查询,赋值方式通过WHERE 子句的 ‘= ’ 或者IN 条件赋值。

catalogName.schemaName.paramView1视图的定义为例,查询该视图需要给视图中声明的参数复制,假设paramA的值为 'a', paramB 的值为 20, paramC的值需要用默认值。则查询参数化视图的语句为:

SELECT * FROM catalogName.schemaName.paramView1
WHERE paramA='a' and paramB=20 or columnD='2024-01-01';

这里的的参数化视图为catalogName.schemaName.paramView1通过WHERE后面有三个等值,其中paramA='a'paramB=20为赋值语句,表示参数paramA的值为'a'并且paramB的值为20, 而这里的columnD='2024-01-01'为等值比较语句,这里需要注意区分一下。参数和参数之间的逻辑关系只能是AND连接, 不能是OR。 只有当等值语句为已经声明了的参数,= 符号才会变成赋值语句,其他的情况都为SQL中的等值比较语句。此时查询参数化视图,相当于执行以下这条查询语句。

SELECT * FROM (
  SELECT *, 'a' -- 原始的paramA被替换成了'a'
  FROM table 
  WHERE columnA = 'a' -- 原始的paramA被替换成了'a'
    ANS columnB > 20 -- 原始的paramB被替换成了20
    AND YEAR(columnC) = YEAR('2025-04-01') -- 原始的paramC因为没有赋值,使用默认值'2025-04-01'
) AS paramView1 
WHERE paramView1.columnD='2024-01-01'

除了通过=符号对参数进行赋值外, 也可以通过IN条件对参数进行赋值。通过IN赋值表示两个参数的查询结果取UNION集合。

SELECT * FROM catalogName.schemaName.paramView1
WHERE paramA IN ('a', 'b') 
  and paramB=20 
  or columnD='2024-01-01';

这里的参数paramA通过IN 赋值了两个值,上述的语法执行逻辑为:

(
    SELECT * FROM (
    SELECT *, 'a' -- 原始的paramA被替换成了'a'
    FROM table 
    WHERE columnA = 'a' -- 原始的paramA被替换成了'a'
      ANS columnB > 20 -- 原始的paramB被替换成了20
      AND YEAR(columnC) = YEAR('2025-04-01') -- 原始的paramC因为没有赋值,使用默认值'2025-04-01'
    ) AS paramView1 
    WHERE paramView1.columnD='2024-02-01'
)
UNION 
(
  SELECT * FROM (
  SELECT *, 'b' -- 原始的paramA被替换成了'b'
  FROM table 
  WHERE columnA = 'b' -- 原始的paramA被替换成了'b'
    ANS columnB > 20 -- 原始的paramB被替换成了20
    AND YEAR(columnC) = YEAR('2025-04-01') -- 原始的paramC因为没有赋值,使用默认值'2025-04-01'
  ) AS paramView1 
  WHERE paramView1.columnD='2024-01-01'
)

现在介绍第二中,对于包含join的查询,赋值方式通过ON后面的 '=' 或者IN 条件 赋值。

现在有两个视图,paramView1, paramView2, 两个视图的定义分别为:

CREATE VIEW catalogName.schemaName.paramView1 
AS 
select * from tableA where columnA = @param
USING PARAMETERS (
  param varchar
)
CREATE VIEW catalogName.schemaName.paramView2
AS 
select * from tableB where columnB = @param
USING PARAMETERS (
  param varchar
)

两个视图进行join 查询时候,查询和赋值的SQL为:

select paramView1.*, paramView2.* 
from paramView1 left join paramView2 
on 
  paramView1.param= 'a' and -- 此处的 `=`为赋值操作
  paramView2.param='b' and  -- 此处的 `=`为赋值操作
  paramView1.columnC = paraView2.columnC; -- 此处的 `=` 为比较操作

以上的例子中通过paramView1和paramView2 的参数都为param, 我们可以通过参数化视图的名称.参数名进行访问并赋值。上述的语法的执行逻辑为:

select paramView1.*, paramView2.* 
from 
  (select * from tableA where columnA = 'a') as paramView1
left join 
  (select * from tableB where columnB = 'b') as paramView2
on paramView1.columnC = paraView2.columnC;

参数化视图的参数名不可以和表的列重名,否则改列名会被当作参数进行赋值,而不是将其视作表的某一列,但是不同的参数化视图之间可以允许参数名重复。

使用 Hint 查询分区视图

/+ options("planner.parameter.default.value" = '=') /

PARTITION VIEW

时间分区视图。

  • 功能描述

创建时间分区视图。分区视图是在普通视图的基础上,支持通过$biz_date为参数执行该视图中的时间分区,随后通过指定$biz_date的值,查询该视图中的指定时间分区。$biz_date 的类型仅支持date, timestamp, varchar(时间类型的字符串形式)的类型。

  • 语法说明
CREATE [OR REPLACE] VIEW <viewPath>($biz_date <Parameter Type>) AS {query}
  • 常见用法
CREATE VIEW "catalogName"."schemaName"."viewName"($biz_date VARCHAR) AS select * from "table1" where pt='$biz_date';
  • 功能描述

创建时间分区视图后查询视图有两种方式: 直接查询和构建RP后间接查询。

如果时间分区视图没有构建RP, 却直接查询,AIR会报错:Projection for this view is not available.

  • 语法说明
-- 直接查询
SELECT colName [, colName]... FROM <paramViewName>('<param>')
-- 构建RP 后间接查询
SELECT colName [, colName]... FROM
  • 使用示例
-- 未构建RP后的查询方式
SELECT * FROM "catalogName"."schemaName"."paramView"('2024-01-01');

-- 已经构建RP后的查询方式
SELECT * FROM "catalogName"."schemaName"."paramView";

CREATE DIALECT VIEW

构建参数化视图。

  • 功能描述

在某些场景下,存在一些底层源特有的语法或者函数,例如某些涉及企业内部安全需要的加密函数,或者有些当前虚拟化引擎暂不支持的语言特性,可以通过创建Dialect View方式可以直接在虚拟化引擎创建符合底层源特有语法的SQL代码,这些代码会被虚拟化引擎直接发送到底层源引擎执行(注意:这部分代码无法依赖虚拟化引擎生成的表,只能依赖底层引擎内部已有的表),从而实现对某些特定底层语法的支持。在虚拟化引擎中,可以把Dialect View当成普通视图去消费,不会存在任何限制。

  • 语法说明
CREATE [ OR REPLACE ] DIALECT VIEW view_name
AS {DIALECT.QUERY}
  • 使用实例
CREATE DIALECT VIEW "dialect_view_test"."oracle_test"."keep_func_view" AS DIALECT.QUERY(
'catalog' => 'oracle', 
'query' => 'SELECT col_date, MAX(col_number) KEEP (DENSE_RANK FIRST ORDER BY col_number DESC) AS max_col_number
FROM ALOUDATA.LONG_TYPE_TABLE GROUP BY col_date'
);

DROP VIEW

  • 语法说明
DROP VIEW [ IF EXISTS ] view_name
  • 功能描述

删除一个已存在的视图。

可选的IF EXISTS子句会在视图不存在时不抛出错误。

ALTER (VIEW)TABLE

  • 给某个视图设置额外属性值(共用了Table的语法)
  • 语法说明参考TABLE相关语法说明
  • 例如:控制某个视图构建时是否启用下推
ALTER TABLE OR VIEW "default_air_catalog"."default"."test1" SET TABLE PROPERTIES 
('enablePushdown':'false');