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

本文主要是介绍问题解决:除非另外还指定了 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 testWHERE  1=1  AND I_COMMON = 1 ) AS wf ORDER BYwf.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 BYwf.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 BYwf.S_VER ASC)  a column1    ---------- 14         已选定 1 条记录 [抓取元数据:0ms] [抓取数据:0ms] [已执行:2020-6-9 下午1:35:03] [执行:4ms] 

在这里插入图片描述

总结

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

随缘求赞

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

这篇关于问题解决:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114809

相关文章

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Python中ModuleNotFoundError: No module named ‘timm’的错误解决

《Python中ModuleNotFoundError:Nomodulenamed‘timm’的错误解决》本文主要介绍了Python中ModuleNotFoundError:Nomodulen... 目录一、引言二、错误原因分析三、解决办法1.安装timm模块2. 检查python环境3. 解决安装路径问题