一个clickhouse易错的语法问题

sql 复制代码
WITH RECURSIVE
  digits(z, lp) AS (
    SELECT '1', 1
    UNION ALL SELECT
    toString(lp+1) as z, lp+1 as lp FROM digits WHERE lp<9
  )
SELECT z, lp, toTypeName(z), toTypeName(lp) FROM digits;

的执行结果如下,看起来z是跳过了2,只返回8行

复制代码
   ┌─z─┬─lp─┬─toTypeName(z)─┬─toTypeName(lp)─┐
1. │ 1 │  1 │ String        │ UInt64         │
2. │ 3 │  2 │ String        │ UInt64         │
3. │ 4 │  3 │ String        │ UInt64         │
4. │ 5 │  4 │ String        │ UInt64         │
5. │ 6 │  5 │ String        │ UInt64         │
6. │ 7 │  6 │ String        │ UInt64         │
7. │ 8 │  7 │ String        │ UInt64         │
8. │ 9 │  8 │ String        │ UInt64         │
   └───┴────┴───────────────┴────────────────┘

而duckdb中如下SQL的执行结果正确

sql 复制代码
WITH RECURSIVE
           digits(z, lp) AS (
             SELECT '1', 1
             UNION ALL SELECT
             (lp+1)::varchar as z, lp+1 as lp FROM digits WHERE lp<9
           )
         SELECT z, lp, Typeof(z), Typeof(lp) FROM digits;
┌─────────┬───────┬───────────┬────────────┐
│    z    │  lp   │ typeof(z) │ typeof(lp) │
│ varchar │ int32 │  varchar  │  varchar   │
├─────────┼───────┼───────────┼────────────┤
│ 1       │     1 │ VARCHAR   │ INTEGER    │
│ 2       │     2 │ VARCHAR   │ INTEGER    │
│ 3       │     3 │ VARCHAR   │ INTEGER    │
│ 4       │     4 │ VARCHAR   │ INTEGER    │
│ 5       │     5 │ VARCHAR   │ INTEGER    │
│ 6       │     6 │ VARCHAR   │ INTEGER    │
│ 7       │     7 │ VARCHAR   │ INTEGER    │
│ 8       │     8 │ VARCHAR   │ INTEGER    │
│ 9       │     9 │ VARCHAR   │ INTEGER    │
└─────────┴───────┴───────────┴────────────┘

引起此问题的原因是clickhouse 在toString中引用了本轮重新计算的lp列别名,而不是上一轮递归的lp列。where引用的也是本轮重新计算的lp列别名,导致递归少了一轮,结果少了1行。

改为如下就正确了

sql 复制代码
:) WITH RECURSIVE
  digits(z, lp) AS (
    SELECT '1', 1
    UNION ALL SELECT
    toString(lp+1) as z, lp+1 as lp2 FROM digits WHERE lp<9
  )
SELECT z, lp, toTypeName(z), toTypeName(lp) FROM digits;



   ┌─z─┬─lp─┬─toTypeName(z)─┬─toTypeName(lp)─┐
1. │ 1 │  1 │ String        │ UInt64         │
2. │ 2 │  2 │ String        │ UInt64         │
3. │ 3 │  3 │ String        │ UInt64         │
4. │ 4 │  4 │ String        │ UInt64         │
5. │ 5 │  5 │ String        │ UInt64         │
6. │ 6 │  6 │ String        │ UInt64         │
7. │ 7 │  7 │ String        │ UInt64         │
8. │ 8 │  8 │ String        │ UInt64         │
9. │ 9 │  9 │ String        │ UInt64         │
   └───┴────┴───────────────┴────────────────┘
相关推荐
DevOpenClub16 分钟前
高考教育信息问答 API:会话参数、资料引用与流式响应
java·数据库·高考
yuanyuan33420 分钟前
2026枣庄带检测报告伸缩门品牌测评|本地服务
大数据·数据库·人工智能·伸缩门
wdyan29729 分钟前
带着小白学习-微服务-5 实战:配置中心-数据库连接
数据库·学习·微服务
大维2 小时前
DBX 实测:从 SQLite 查询到 MiniMax-M3 自然语言生成 SQL
数据库·sql·sqlite
玖米GEO运营王总监2 小时前
2026年账号矩阵协同效应怎么量化:三个指标与公式结构
java·大数据·数据库
景煜拾年4 小时前
InnoAI SQL 助手
运维·数据库·笔记·sql
.痞老板.4 小时前
mysql初阶--数据类型
android·数据库·mysql
Risehuxyc5 小时前
MySQL密码插件
数据库·mysql
腾科IT教育5 小时前
Oracle考试全解析:OCP、OCM认证体系与核心考点备考指南
数据库·oracle·开闭原则
叼烟扛炮15 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php