背景:
项目中需要使用A表left join B表,并且B表中有重复的key时只显示一条。在MySql中可以这样实现:
select
*
from
a t1
left join b t2
on t1.key= t2.key
and
t2.id =(select min(id) from b where key =t2.key)
也就是在join操作后还需要使用一个子查询限制B表相同key的数据只使用一条。在Clickhouse中可以使用any left join实现相同的功能:
select
*
from
a t1
any left b t2
on t1.key = t2.key
在项目中使用any left join却报了错:
syntax error: syntax error, error in :' )a2 ANY LEFT JOIN t_test test o', expect ANY, actual ANY pos 2978, line 88, column 8, token ANY
环境:
JDK1.8
<druid.version>1.1.10</druid.version>
解决方法:
升级druid到<druid.version>1.2.6</druid.version>
并取消使用druid filter 准确来说是:wall
解决过程:
看到错误信息是: expect ANY, actual ANY 也就是期望是ANY,而得到的也是ANY。这不就是想啥来啥多少人梦寐以求的心想事成吗?怎么还报错了呢。是不是MyBatis XML中配置Sql时有特殊字符?删了重新编写依然报错依旧。仔细看错误信息发现:
ALL LEFT JOIN t_test a o, pos 2985, line 90, column 5, token ALL
at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:576)
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:602)
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:124)
at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:630)
从错误信息看出原来是druid报的错误,检查druid版本,发现使用的版本较低就升级到了最新的版本。但问题依旧。项目暂时用不到druid wall过滤器,索性就取消了过滤器。取消后可以正常执行any left join语句.
那么问题来了:
如果还想同时使用druid的过滤器咋办?
当然可以修改wall filter源码以支持clickhouse sql.
如果不想改代码还可以?
提示 clickhouse