注册 登录
编程论坛 SQL Server论坛

Order by 的问题

小仙 发布于 2008-10-08 22:13, 3622 次点击
今天看书看出个问题来了,有如下代码:
程序代码:

use Northwind
select p.*
from (select ProductID,ProductName,CategoryID,UnitPrice '单价'
from dbo.Products) as p
order by '单价'

书上的源码,要说明的意思是,“当表的字段在Select子查询中使用的是另外指定的别名时,只能使用别名来限定其在
Order by子句中的行”意思我大概明白了,可是执行起来,却给我报了这么个错:消息 408,级别 16,状态 1,第 1 行
在 ORDER BY 列表中的位置 1 处遇到常量表达式。双击时高亮的是“select p.*”,一开始我想是书写错了,可这本书是胡百敬写的,素有铁人之称的人物应该不会出这种错,果不其然在别人机器上运行却是好的,听人家说是没有打补丁,请问下大家是怎么回事?是补丁的问题吗?
25 回复
#2
myemail19832008-10-08 22:34
我刚试了试,没有问题,你那为什么不行就不清楚了,不过
单价加引号是不对的,不信你加个desc试试
#3
小仙2008-10-08 22:44
呃。。还真是'号的问题,去掉了就好了,你试的时候, 加了引号的么?奇怪,书上写的就是引号,还有为什么写引号,报的常量错误点击却亮在了select p.*”我觉得应该亮在
order by '单价'这。。
#4
myemail19832008-10-08 23:01
有时就是这样,我记得有时用group by 列名,如果这个列名没有出现在表中,它报的却是select 处无此列名
#5
myemail19832008-10-08 23:03
我试的时候加引号了,可以查询出来,但就是没有起到排序的作用
#6
小仙2008-10-08 23:11
这个引号的作用,在于对p表来查询,因为就最外层而言,Select p.*是不能识别unitprice是什么的,这时的p表只有单价这一列,而没有unitprice这列。问题的问题是,怎么你用引号就行,我用引号就不行。莫非是人品问题?

[[it] 本帖最后由 小仙 于 2008-10-8 23:14 编辑 [/it]]
#7
myemail19832008-10-08 23:29
[bo][un]myemail1983[/un] 在 2008-10-8 22:34 的发言:[/bo]

我刚试了试,没有问题,你那为什么不行就不清楚了,不过
单价加引号是不对的,不信你加个desc试试

这就不清楚了,我这反正是没事
#8
小仙2008-10-09 12:47
呃。。。楼下有高人现身吗?期待个。
#9
小仙2008-10-09 22:34
呃。。话说很少有人注意到这个问题还是。。。。
#10
宠物在线2008-10-10 14:54
ORDER BY 后面的字段名是不用加单引号的。
#11
伤狼2008-10-10 14:59
你用的是什么数据库 2000?

要是2000的话 就需要 sp3补丁的支持
#12
小仙2008-10-11 14:17
我用的SQL2005,需要什么补丁呢??有的人打了引号也可以,我打了引号就报错,不晓得是什么问题哦。
#13
西风独自凉2008-10-11 16:53
use Northwind
select p.*
from (select ProductID,ProductName,CategoryID,UnitPrice 单价
from dbo.Products) as p
order by 单价


use Northwind
select p.*
from (select ProductID,ProductName,CategoryID,UnitPrice '单价'
from dbo.Products) as p
order by '单价'

都可以啊

[[it] 本帖最后由 西风独自凉 于 2008-10-11 16:55 编辑 [/it]]
#14
小仙2008-10-11 18:23
呃。。那问题看来很大。。。有哪位知道是需要打什么补丁。
#15
hmhz2008-10-11 21:35
2000的补丁都打到sp4了,另外,前面的单价是字段名,难道你的单价是字段名吗?后面的单价是排序用的字段名
不是直接使用值来排序,即使是按值来排序也不是这样写

应该这样写
order by (case 字段名 when '单价' then 1 end) Asc
#16
小仙2008-10-11 21:45
回复 15# hmhz 的帖子
首先谢谢你的分析,不过我使用的是SQL2005前面已经提到过,再者呢,我的语句在帖子里,只能写单价,写unitprice就会报错。现在的问题是,单价那到底需要不需要引号,有的人说要,有的人说不要,有的人说要和不要都可以。。很迷茫的。。。
重点倒不在排序上。。。
#17
小仙2008-10-11 21:53
回复 15# hmhz 的帖子
“前面的单价是字段名,难道你的单价是字段名吗?后面的单价是排序用的字段名”这句话我不大懂。。。这个单价一直是在表P中,就是一个字段啊,你的意思是??肯定不是一个值啊。
#18
hmhz2008-10-11 21:54
unitprice 可能是关键词,你用[]阔起来 [unitprice]
#19
hmhz2008-10-11 21:56
加单引号表示这个单价是个文本类型,就是值了,而前面的单价位置应该放字段名,我不知道你单价是字段名,还是unitprice字段里的值
#20
小仙2008-10-11 21:57
晕。。在这里,unitprice是P表中不存在的字段,所以不能用unitprice排序。P表中只存在单价这一列。但是我不知道,这个字段:单价到底该不该加上引号呢?
#21
hmhz2008-10-11 22:05
你可以连起来看
select ProductID,ProductName,CategoryID,UnitPrice '单价' from dbo.Products

很明显,单价那个位置应该跟前面的一样使用字段名字
比如数据结构是这样
ProductID  ProductName  CategoryID  UnitPrice   单价
1             sdfsdf        1         1.5       2.5
1             sdfsdf        1         1.5       2.5
1             sdfsdf        1         1.5       2.5
1             sdfsdf        1         1.5       2.5

这里的的字段名就是 “单价”

select ProductID,ProductName,CategoryID,UnitPrice,单价 from dbo.Products

后面的排序直接使用 order by 单价
都不能有单引号
#22
小仙2008-10-11 22:11
use Northwind
select p.*
from (select ProductID,ProductName,CategoryID,UnitPrice '单价'
from dbo.Products) as p
order by '单价'
这个代码,和你的代码不一样。。。。。汗。。。。我理解你的意思,可你的回答,不是针对我的问题。。。我们两段代码的情况是不一样的。你不觉得我的代码中,是不存在unitprice的?P中它已经被单价取代了,至于排序的字段名,我也觉得不应该要引号,可是为什么有的人写引号也可以通过呢?
#23
hmhz2008-10-11 22:15
如果说另一个表中是单价做为字段名,那这里的UnitPrice当然要和另一个的字段名相同才行,
应该这样写
select ProductID,ProductName,CategoryID,UnitPrice as 单价 from dbo.Products
#24
小仙2008-10-11 22:18
呃。。谈了半天,我发现咱们不是谈的一个话题。。。麻烦您能多看下我上一句吗。。。
#25
hmhz2008-10-11 22:25
累,你还是把补丁打到sp4看看吧,睡觉了
#26
小仙2008-10-12 17:28
SQL2005有些什么补丁?我不知道该下哪一个。。
1