Clickhouse关联子查询引用主查询字段报Missing columns错误如何解决
问题原因
你使用的ClickHouse 21.3.14版本不支持SELECT子句中引用外层查询字段的关联子查询,这类子查询语法是PostgreSQL等传统关系型数据库的标准语法,但ClickHouse直到21.8版本才完成对该语法的支持,因此会出现找不到ch.trackable_id字段的报错。
解决方案
方案1:升级ClickHouse版本
升级到21.8及以上的正式版本,你现有SQL无需修改即可正常运行。
方案2:改用窗口函数实现同等逻辑(无需升级)
你要实现的是取每个trackable_id对应的第一条action='create'记录的time,可以用窗口函数实现,该语法在21.3版本完全支持,且执行效率比原生关联子查询更高:
SELECT first_value(time) FILTER (WHERE action = 'create') OVER ( PARTITION BY trackable_id ORDER BY time ASC ) AS create_time FROM changes ch LIMIT 1000
如果需要排除没有create动作的记录,可以在外层加WHERE条件过滤。
方案3:改用LEFT JOIN + 聚合实现(无需升级)
如果窗口函数不符合你的复杂业务场景,也可以用关联聚合的方式实现:
SELECT create_time FROM changes ch LEFT JOIN ( SELECT trackable_id, min(time) AS create_time FROM changes WHERE action = 'create' GROUP BY trackable_id ) ch2 ON ch.trackable_id = ch2.trackable_id LIMIT 1000
内容的提问来源于stack exchange,提问作者Aleksei Pokhodnia
相关产品推荐
相关产品推荐

