| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1168 人关注过本帖, 1 人收藏
标题:一个关于排序的奇怪问题【已解决】
只看楼主 加入收藏
天堂落日
Rank: 2
等 级:论坛游民
威 望:2
帖 子:182
专家分:10
注 册:2007-6-17
结帖率:100%
收藏(1)
 问题点数:0 回复次数:4 
一个关于排序的奇怪问题【已解决】
问题是这样产生的,在知道一个表名的时候,我想分别把表中的字段显示出来
以NorthWind中的Employees表为例
于是写了如下代码
程序代码:
select top 1 name from (
    select top 4 * from syscolumns where id=(
        select id from sysobjects where xtype='U' and name='Employees') 
    order by name asc )t
order by name desc

此查询的结果是将employees表中的字段作为字符串进行排序,并查出排在第四位的字段的名称
可是对倒数第二行后边的关键字t很是疑惑,不知道该字到底起什么作用?
奇怪的是t字去掉之后就会报错

消息 156,级别 15,状态 1,第 5 行
关键字 'order' 附近有语法错误。


本来我以为这个是关键字,后来经过反复试验,发现只要在这里随便写上一个字母就可以成功执行,这个字母到底起到什么作用?这可是随手乱写的……
但是不写这个字母它就报错,真是晕了
PS:我用的是SQL Server 2005

[[it] 本帖最后由 天堂落日 于 2008-1-28 17:51 编辑 [/it]]
2008-01-28 00:45
天堂落日
Rank: 2
等 级:论坛游民
威 望:2
帖 子:182
专家分:10
注 册:2007-6-17
收藏
得分:0 
我说的排序就是说把'Employees'中的字段按照字母从a-z的数序排出来
Address
BirthDate
City
Country
EmployeeID
Extension
FirstName
HireDate
HomePhone
LastName
Notes
Photo
PhotoPath
PostalCode
Region
ReportsTo
Title
TitleOfCourtesy

[[it] 本帖最后由 天堂落日 于 2008-1-28 00:55 编辑 [/it]]

2008-01-28 00:54
天堂落日
Rank: 2
等 级:论坛游民
威 望:2
帖 子:182
专家分:10
注 册:2007-6-17
收藏
得分:0 
问题如上,我换了种写法
select top 1 name from (
    select top 2 * from syscolumns where id=(object_id(N'Employees'))
    order by name )t
order by name desc

还是必须在倒数第二行加上一个无关字符,到底是为什么啊?

2008-01-28 01:04
madpbpl
Rank: 4
等 级:贵宾
威 望:11
帖 子:2876
专家分:244
注 册:2007-4-5
收藏
得分:0 
1.在SQL语句中一旦指定了表别名,则不能再使用"表名称.列名"格式,只能使用"表别名.列名"格式来引用列.

2.在SQL主句中使用子查询中的列时,必须为子查询指定一个表别名,然后以"表别名.列名"的格式来应用子查询中的列.当SQL主句的FROM子句仅为一个子查询时,必须为该子查询指定一个表别名,否则SQL语句无法执行.例如:
SELECT ID FROM (select e.ID from employee as e  where (e.年度 = 2000) AND (e.月份 = 3))
提示: ')' 附近有语法错误。正确的应该为:
SELECT ID FROM (select e.ID from employee as e  where (e.年度 = 2000) AND (e.月份 = 3)) AS X

3.子查询中使用了"表别名.列名"来引用列时,若此表别名在子查询和SQL主句中都不存在,则导致SQL语句无法执行.例如:
SELECT ID FROM (select e.ID from employee  where (e.年度 = 2000) AND (e.月份 = 3)) AS X
提示: 列前缀 'e' 与查询中所用的表名或别名不匹配。
如果SQL主句中存在此表别名,则错误不会发生,但会导致无法预料的结果(通常导致该子查询返回结果为空).例如:
SELECT e.* FROM (select * from sales as e where (e.年度 = 2006) and (e.月份 = 3)) AS e
WHERE (e.员工号 NOT IN (select e.员工号 from sales  where (e.年度 = 2000) AND (e.月份 = 3)))
此SQL语句执行后,导致主句的WHERE子句的子查询返回空值,使WHERE子句结果为真,筛选实效.
正确的为:
SELECT e.* FROM (select * from sales as e where (e.年度 = 2006) and (e.月份 = 3)) AS e
WHERE (e.员工号 NOT IN (select e.员工号 from sales as e where (e.年度 = 2000) AND (e.月份 = 3)))
详细参考请查看
http://
2008-01-28 01:44
天堂落日
Rank: 2
等 级:论坛游民
威 望:2
帖 子:182
专家分:10
注 册:2007-6-17
收藏
得分:0 
原来如此啊
谢谢啦

2008-01-28 17:51
快速回复:一个关于排序的奇怪问题【已解决】
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030794 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved