关于SQLServer关键词“unionall”与“orderby”的⽭盾
代码的海,就像我们⼈⽣⼀样。努⼒朝着⼀个⽅向前进,总⽐盲⽬的随波逐流更能快速有效的到达彼岸。
今天在项⽬上遇到这样⼀个问题:当数据源为SQLServer,加上⼀个不成熟的分页插件时,“union all”与“order by”的亲密接触就会遇到诸多问题。
开发环境如下:
语⾔:JAVA
框架:spring boot,MyBatis
数据库:SQLServer
⼀、先来说⼀下关于SQLServer关键词,“union all”与“order by”的问题:
先来看下⼀下语句是否存在问题:
select *
from (
select * from abc1
union all
select * from abc2
) t
order
这样的语句,在SQLServer中执⾏,并不会有什么问题。但是如果以上⾯的SQL语句为⼦查询,在外⾯再包裹⼀层SQL⽤作业务处理的话,那么恭喜你,SQLServer会毫不留情的提⽰你:
除⾮另外还指定了 TOP 或 FOR XML,否则,ORDER BY ⼦句在视图、内联函数、派⽣表、⼦查询和公⽤表表达式中⽆效。
这时候,只需要在select 后⾯加上“top100 PERCENT”,然后在外⾯包裹⼀层就可以正常执⾏了。具体原因可⾃⾏百度。
⼆、再来说⼀下,按照上⾯的问题处理好SQL语句后,如果需要分页的话,那么可能问题⼜来了:
1、先来看下未加分页正确的SQL语句:
SELECT top 100 percent *
from (
select * from abc1
union all
select * from abc2
) t
order by t.CLINICAL_DATE DESC
如果这时候你所⽤到的分页插件不怎么成熟,那么代码就会变成这样:
WITH query AS (
SELECT TOP 100 PERCENT ROW_NUMBER() OVER (order by xxx) as __row_number__, top 100 percent *
分页查询插件from (
select * from abc1
union all
select * from abc2
) t
order by xxx
) SELECT * FROM query WHERE __row_number__ BETWEEN 1 AND 15 ORDER BY __row_number__
执⾏的时候,会提⽰你“top”附近有语法错误,原因是分页插件只判断了在SELECT语句后追加分页属性,⽽没有判断有top的这种情况。
2、解决办法:
(1)、⾃⽤分页插件时,升级分页插件,加上更多、更复杂条件的判断(推荐这种⽅案,因为以后肯定有更多地⽅⽤到);
(2)、⼿动编写分页代码;
(3)、避免在不了解所使⽤的分页插件时,并需要排序的情况下使⽤“union all”关键词。
如果⼤家有更好的⽅案,欢迎留⾔交谈,互相切磋。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论