clickhouse分布式WITH临时表查询问题

文章讲述了作者在ClickHouse分布式环境中遇到的SQL错误,涉及WITH语句创建的临时表t1找不到。解决方法是将WITH语句移动到SQL的第一条语句,因为WITH定义的临时表必须是第一条。通过调整语句顺序解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个简单的sql引起的问题

WITH t1 AS (SELECT id FROM b.ods_a WHERE 1 = 1)
SELECT * FROM (
	SELECT 
		report_time,
        ceil(total * 2.361 / 10000, 2)    total,
        round(neighbor(total, -12), 2) AS prevYear,
        round(neighbor(total, -1), 2)  AS prevMonth
    FROM b.ods_b t2 INNER JOIN  t1 ON t1.id = t2.id
	    GROUP BY report_time
	    ORDER BY report_time
    )
);

SQL 错误 [1002]: ClickHouse exception, code: 1002, host: 10.122.49.209, port: 28124; Code: 60. DB::Exception: Received from ck01:29000. DB::Exception: Table default.t1 doesn't exist. (UNKNOWN_TABLE) (version 22.5.1.2079 (official build))
sql在单机clickhouse运行正常,搭建了一个分布式环境后出现的问题,从报错信息来看,是临时表t1未找到,但是查询的是默认default库
解决方法,就是把with表语句写到sql里去

SELECT * FROM (
	SELECT 
		report_time,
        ceil(total * 2.361 / 10000, 2)    total,
        round(neighbor(total, -12), 2) AS prevYear,
        round(neighbor(total, -1), 2)  AS prevMonth
    FROM b.ods_b t2 INNER JOIN  (SELECT id FROM b.ods_a WHERE 1 = 1) t1 ON t1.id = t2.id
	    GROUP BY report_time
	    ORDER BY report_time
    )
);

但是这样就需要把所有的sql都改一遍,而且为什么用with就是因为业务上有些语句比较复杂,这么写容易看,所以不太希望这么改动,只能再找下原因,本以为官网会有说明,但是没有找到具体的解释,无意中找了一下with的使用限制,里面提到了一句

使用WITH 定义的“临时表(视图)”,必须是定义WITH 后的第一条sql语句

因此将sql调整了一下顺序,发现就可以正常使用了

WITH t1 AS (SELECT id FROM b.ods_a WHERE 1 = 1)
SELECT * FROM (
	SELECT 
		report_time,
        ceil(total * 2.361 / 10000, 2)    total,
        round(neighbor(total, -12), 2) AS prevYear,
        round(neighbor(total, -1), 2)  AS prevMonth
    FROM t1 INNER JOIN  b.ods_b t2 ON t1.id = t2.id
	    GROUP BY report_time
	    ORDER BY report_time
    )
);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_三石_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值