首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

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

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

select top 10 单位地址 from (select top 100 percent * from (报告单 inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid) inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid where 单位地址 like '%" + prefixText + "%'" +Linksql+ " order by bgdid desc) as dwdz group by 单位地址"

当该sql语句能查询到记录时,即记录数>0时,则正常,如果记录数为0,则提示:

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

因为我无法保证肯定会查询到记录,如何修改呢?



[解决办法]
select top 10 单位地址 
from (select top 100 percent * 
from (报告单 inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid) 
inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid 
where 单位地址 like '%" + prefixText + "%'" +Linksql+ " 
order by bgdid desc) as dwdz 
group by 单位地址
order by 单位地址


添加上红色部分 、try
[解决办法]
select top 10 单位地址 
from (
select 字段列表
from 报告单 
inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid
inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid 
where 单位地址 like '%" + prefixText + "%'" +Linksql+ " 
) as dwdz 
group by 单位地址"

把TOP 100 PERCENT去掉,从语句中好像看不出用场
[解决办法]

引用:
select top 10 单位地址 
from (select top 100 percent * 
from (报告单 inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid) 
inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid 
where 单位地址 like '%" + prefixText + "%'" +Li……


问题是我需要以bgdid 反向排序,另外,即使我加上此句,只要查询到的记录为0,依然会出现上述的错误提示,另我用的是vs2010+sql2008
[解决办法]
引用:
select top 10 单位地址 
from (
select 字段列表
from 报告单 
inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid
inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid 
where 单位地址 like '%" + prefixText + "%'" +Linksql+ " 
) ……


这句似乎得有,因为不加的话,order by 会有问题,还会提示这句错误
[解决办法]
去掉top 100 percent试试
[解决办法]
select top 10 单位地址 from (select top 100 percent * from (报告单 inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid) inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid where 单位地址 like '%" + prefixText + "%'" +Linksql+ " order by bgdid desc) as dwdz group by 单位地址"


这是什么语句?这样的语句貌似不能执行的.
如果这是在客户端写的,那,prefixtext和linksql是什么样的?
------解决方案--------------------


引用:
SQL code
select top 10 单位地址 from (select top 100 percent * from (报告单 inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid) inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid where 单位地址 like '%" + prefixText + "%'" +……


prefixtext 为 "食品"
linksql 为" and 单位名称='好利来食品公司'"

这个语句可以执行,在vs2010中,只是如果查询不到时,就会报错
[解决办法]
引用:
去掉top 100 percent试试


去掉情况一下
[解决办法]
就楼主的语句,不考虑那两个变量,程序不出错:
create table 报告单(bgdid int,sjdwmcid int,sjdwdzid int)
create table 单位名称(dwmcid int,名称 nvarchar(10))
create table 单位地址(dwdzid int,单位地址 nvarchar(10))

select top 10 单位地址  
from (
select top 100 percent *  
from (报告单 inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid)  
inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid  
where 单位地址 like '%北京%'  
order by bgdid desc
) as dwdz  
group by 单位地址

drop table 报告单,单位名称,单位地址
/*
单位地址
----------

(0 行受影响)

*/

[解决办法]
引用:
引用:
SQL code
select top 10 单位地址 from (select top 100 percent * from (报告单 inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid) inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid where 单位地址 like ……

如果是这样,仍然不会出错:
create table 报告单(bgdid int,sjdwmcid int,sjdwdzid int)
create table 单位名称(dwmcid int,单位名称 nvarchar(10))
create table 单位地址(dwdzid int,单位地址 nvarchar(10))

select top 10 单位地址 from (
select top 100 percent * 
from (报告单 inner join 单位名称 on 单位名称.dwmcid=报告单.sjdwmcid) 
inner join 单位地址 on 单位地址.dwdzid=报告单.sjdwdzid 
where 单位地址 like '%食品%' and 单位名称='好利来食品公司' order by bgdid desc) as dwdz group by 单位地址 --"


/*
单位地址
----------

(0 行受影响)

*/

[解决办法]
引用:
就楼主的语句,不考虑那两个变量,程序不出错:

SQL code
create table 报告单(bgdid int,sjdwmcid int,sjdwdzid int)
create table 单位名称(dwmcid int,名称 nvarchar(10))
create table 单位地址(dwdzid int,单位地址 nvarchar(10))

select top ……


试试,不过真不明白,为什么在记录数为0的情况下才会报错?
[解决办法]
还是没有比较好的解决办法
[解决办法]
在select后添加top和一个足够大的正整数就行了,例如top 1000。无需再做任何添加,否则你打开视图会发现排序结果并不是你希望的那样。

热点排行