因为这一步不返回表(而是返回游标),使用了ORDER BY子句的查询不能用作表表达式。表表达式包括:视图、内联表值函数、子查询、派生表和共用表达式。它的结果必须返回给期望得到物理记录的客户端应用程序。例如,下面的派生表查询无效,并产生一个错误: 复制代码 代码如下: select * from(select orderid,customerid from orders order by orderid) as d
下面的视图也会产生错误 复制代码 代码如下: create view my_view as select * from orders order by orderid
错误信息: Msg 1033, Level 15, State 1, Procedure my_viewasselect, Line 2The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries,and common table expressions, unless TOP or FOR XML is also specified. 在SQL中,表表达式中不允许使用带有ORDER BY子句的查询,而在T—SQL中却有一个例外(应用TOP选项)。 所以要记住,不要为表中的行假设任何特定的顺序。换句话说,除非你确定要有序行,否则不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要执行有序索引扫描或使用排序运行符。
推荐一段SQL代码:行列转置 复制代码 代码如下: /*问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成(得到如下结果): 姓名 语文 数学 物理 ---- ---- ---- ---- 李四 74 84 94 张三 74 83 93 ------------------- */ create table tb(姓名 varchar(10),课程 varchar(10),分数 int) insert into tb values("张三" , "语文" , 74) insert into tb values("张三" , "数学" , 83) insert into tb values("张三" , "物理" , 93) insert into tb values("李四" , "语文" , 74) insert into tb values("李四" , "数学" , 84) insert into tb values("李四" , "物理" , 94) go --SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同) select 姓名 as 姓名 , max(case 课程 when "语文" then 分数 else 0 end) 语文, max(case 课程 when "数学" then 分数 else 0 end) 数学, max(case 课程 when "物理" then 分数 else 0 end) 物理 from tb group by 姓名