标签:actual t2 druid Druid key join ANY left
背景:
项目中需要使用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
标签:actual,t2,druid,Druid,key,join,ANY,left 来源: https://blog.51cto.com/u_14256460/2785243
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。