问题解决:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

问题场景

因为项目需要,需要在公共框架里面引入sqlserver方言类。而在实现sqlserver方言类之后,调用方言类的方法的时候,发现一个错误
在这里插入图片描述
错误提示如下:

>[错误] 脚本行:1-10 --------------------------------------
 Id 1033, Level 15, State 1, Line 10
	除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
 消息: 1033, 级别: 15, 状态: 1, 过程: , 行: 10 

运行的SQL如下:

SELECT COUNT(*) 
FROM (	
	SELECT wf.S_VER        AS "S_VER"
	FROM (	SELECT DISTINCT(S_VER)
			FROM test
			WHERE  1=1  AND I_COMMON = 1 
		) AS wf 
	ORDER BY
		wf.S_VER ASC
)  a

问题环境

软件版本
SqlServer2008

问题原因

从问题的提示,我们可以看出,我们执行的SQL内部含有order by关键字,而且是在子查询等情况使用了该关键字,导致了数据库引擎认为该SQL有问题,所以报错了。
在这里插入图片描述

解决方案

在这里插入图片描述
这个时候,我们可以使用top关键字来规避这个问题。而top关键字有两种方法使用:

  1. 指定具体数目
    我们可以用具体的数字里进行限量获取,这个和mysqllimit关键字有点像。这里用一个sql来展示从表中获取第20个之后的10个数据:

    SELECT  TOP  10 * 
    FROM  test2
    WHERE  id NOT IN( SELECT top  20 id FROM  test2 )
    
  2. 指定具体百分比
    如果我们的sql需要获取全部数据来做过滤,又不知道具体的数目,这个时候就可以用百分比来进行获取,其表达形式为TOP N percentN为百分比数目,百分比值必须介于 0 到 100 之间,不然会报错。像我们文章开头说的问题SQL,就需要使用这个,经过修正之后,SQL如下:

    SELECT COUNT(*) 
    FROM (	
    	SELECT  top 100 percent wf.S_VER        AS "S_VER"
    	FROM (	SELECT DISTINCT(S_VER)
    			FROM DWF_DE_WF 
    			WHERE  1=1  AND I_COMMON = 1 
    		) AS wf 
    	ORDER BY
    		wf.S_VER ASC
    )  a
    

结果

经过修正之后,sql执行结果如下:

>[SQL] 脚本行:1-10 -------------------------------------
 SELECT COUNT(*) 
 FROM (	
 	SELECT  top 100 percent wf.S_VER        AS "S_VER"
 	FROM (	SELECT DISTINCT(S_VER)
 			FROM DWF_DE_WF 
 			WHERE  1=1  AND I_COMMON = 1 
 		) AS wf 
 	ORDER BY
 		wf.S_VER ASC
 )  a 

 column1    
 ---------- 
 14         

 已选定 1 条记录 [抓取元数据:0ms] [抓取数据:0ms] 

 [已执行:2020-6-9 下午1:35:03] [执行:4ms] 

在这里插入图片描述

总结

这个是sqlserver的小知识点,主要是通过这个问题,引出对top关键字的使用。
在这里插入图片描述

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!
在这里插入图片描述
拜拜

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
目录 致谢 引言 第1章 T-SQL查询和编程基础  1.1 理论背景  1.2 SQL SERVER体系结构  1.3 创建和定义数据完整性  1.4 总结 第2章 单查询  2.1 SELECT语句的元素  2.2 谓词和运算符  2.3 CASE表达式  2.4 NULL值  2.5 同时操作(ALL-AT-ONCE OPERATION)  2.6 处理字符数据  2.7 处理日期和时间数据  2.8 查询元数据  2.9 总结  2.10 练习  2.11 解决方案 第3章 联接查询  3.1 交叉联接  3.2 内联接  3.3 特殊的联接实例  3.4 外联接  3.5 总结  3.6 练习  3.7 解决方案 第4章 子查询  4.1 独立子查询  4.2 相关子查询  4.3 高级子查询  4.4 总结  4.5 练习  4.6 解决方案 第5章 表达式  5.1 派生  5.2 公用表达式(CTE)  5.3 视图  5.4 内联值函数  5.5 APPLY运算符  5.6 总结  5.7 练习  5.8 解决方案 第6章 集合运算  6.1 UNION(并集)集合运算  6.2 INTERSECT(交集)集合运算  6.3 EXCEPT(差集)集合运算  6.4 集合运算的优先级  6.5 避开不支持的逻辑查询处理  6.6 总结  6.7 练习  6.8 解决方案 第7章 透视、逆透视及分组集    7.1 透视转换  7.2 逆透视转换  7.3 分组集  7.4 总结  7.5 练习  7.6 解决方案 第8章 数据修改  8.1 插入数据  8.2 删除数据  8.3 更新数据  8.4 合并数据  8.5 通过表达式修改数据  8.6 带有TOP选项的数据更新  8.7 OUTPUT子句  8.8 总结  8.9 练习  8.10 解决方案 第9章 事务和并发  9.1 事务  9.2 锁定和阻塞  9.3 隔离级别  9.4 死锁  9.5 总结  9.6 练习 第10章 可编程对象  10.1 变量  10.2 批处理  10.3 流程控制元素  10.4 游标  10.5 临时  10.6 动态SQL  10.7 例程  10.8 错误处理  10.9 总结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

枫夜求索阁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值