跳至主要內容

...大约 4 分钟

查询写回(SELECT ... INTO ...)

SELECT ... INTO ... 语句允许您将查询结果集写回到指定序列上。

SQL

语法

下面是 select 语句的语法定义:

selectClause 
intoClause? 
fromClause 
whereClause? 
specialClause?

如果去除 intoClause 子句,那么 select 语句即是单纯的查询语句。

intoClause 子句是写回功能的标记语句。

下面是 intoClause 子句的定义:

intoClause
  : INTO ALIGNED? intoPath (COMMA intoPath)*
  ;

intoPath
  : fullPath
  | nodeNameWithoutStar (DOT nodeNameWithoutStar)*
  ;

intoPath(目标序列)支持两种方式指定:

  • root 开头的完整序列名指定

    • 例子:

      select s1, s1 
      into root.sg.d1.t1, root.sg.d1.t2 
      from root.sg.d1
      
  • 不以 root 开头的部分序列名指定,此时目标序列由 from 子句中的序列前缀和intoPath拼接而成

    • 例子:

      select s1, s1 
      into t1, t2 
      from root.sg.d1
      

      这等价于

      select s1, s1 
      into root.sg.d1.t1, root.sg.d1.t2 
      from root.sg.d1
      

intoPath 中,您还可以使用 ${i}风格的路径匹配符来表示from子句中的部分路径。

比如,对于路径root.sg1.d1.v1而言,${1}表示sg1${2}表示d1${3}表示v1

  • 例子:

    select s1, s1, s1
    into ${1}_t1, ${2}, root.${2}.${1}.t2
    from root.sg.d1
    

    这等价于

    select s1, s1, s1
    into root.sg.d1.sg_t1, root.sg.d1.d1, root.d1.sg.t2
    from root.sg.d1
    

您可以通过关键词 ALIGNED 指定 intoPath(目标序列)是否为一个对齐时间序列。

当目标序列存在时,您需要保证源序列和目标时间序列的类型匹配。

当目标序列不存在时,系统将自动创建一个新的目标对齐时间序列。

  • 例子:

    select s1, s2, s3
    into aligned root.sg.d2.t1, root.sg.d2.t2, root.sg.d2.t3
    from root.sg.d1
    

支持写回的查询类型

注意,除了下述类型的查询,其余类型的查询(如LAST查询和原始聚合查询)都不被支持。

  • 原始序列查询

    select s1, s1 
    into t1, t2 
    from root.sg.d1
    
  • 时间序列生成函数查询(UDF查询)

    select s1, sin(s2) 
    into t1, t2 
    from root.sg.d1
    
  • 数学表达式查询

    select s1, sin(s2), s1 + s3 
    into t1, t2, t3 
    from root.sg.d1
    
  • 嵌套查询

    select -s1, sin(cos(tan(s1 + s2 * s3))) + cos(s3), top_k(s1 + s3, 'k'='1') 
    into t1, t2, t3 
    from root.sg.d1
    
  • Fill 查询

    select s1 
    into fill_s1 
    from root.sg.d1 
    where time = 10 
    fill(float [linear, 1ms, 1ms])
    
  • Group By 查询

    select count(s1) 
    into group_by_s1 
    from root.sg.d1 
    group by ([1, 5), 1ms)
    
  • Group By Fill 查询

    select last_value(s1) 
    into group_by_fill_s1 
    from root.sg.d1 
    group by ([1, 10),1ms) 
    fill (float[PREVIOUS])
    

支持写回的查询子句

注意,除了下述子句,其余查询子句(如 DESC / SOFFSET 等)都不被支持。

  • 支持值过滤

    select s1, s1 
    into t1, t2 
    from root.sg.d1
    where s1 > 0 and s2 < 0
    
  • 支持时间过滤

    select s1, s1 
    into t1, t2 
    from root.sg.d1
    where time > 0
    
  • LIMIT / OFFSET

    select s1, s1 
    into t1, t2 
    from root.sg.d1
    limit 5 offset 1000
    

其他限制

  • select子句中的源序列和into子句中的目标序列数量必须相同
  • select子句不支持带 */** 查询
  • into子句中的目标序列不必预先创建(可使用自动创建schema功能),但是当into子句中的目标序列已存在时,您需要保证select子句中的源序列和into子句中的目标序列的数据类型一致
  • into子句中的目标序列必须是互不相同的
  • from子句只允许有一列序列前缀
  • from子句不支持带 */**
  • 由于时间序列生成函数查询(UDF查询)/ 数学表达式查询 / 嵌套查询 尚不支持对齐时间序列(Aligned Timeseries),所以如果您在select子句中使用了上述查询,并且对应操作数包含对齐时间序列,会提示错误

权限

用户必须有下列权限才能正常执行查询写回语句:

  • 所有 select 子句中源序列的 READ_TIMESERIES 权限
  • 所有 into 子句中目标序列 INSERT_TIMESERIES 权限

更多用户权限相关的内容,请参考权限管理语句

配置参数

  • select_into_insert_tablet_plan_row_limit:执行 select-into 语句时,一个 insert-tablet-plan 中可以处理的最大行数。 默认为 10000。

Copyright © 2024 The Apache Software Foundation.
Apache and the Apache feather logo are trademarks of The Apache Software Foundation

Have a question? Connect with us on QQ, WeChat, or Slack. Join the community now.