大约 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。