关于SQL子查询中使用order by的问题

问题描述

最近回头看以前的数据库教材《数据库系统概论》人大 王珊 版的有一段叙述:“需要特别指出的是,子查询的select语句不能使用 order by子句,order by子句只能对最终查询结果排序”但是正好之前练习碰到个场景,就在子句中用了order by ,结果也是正确的。所以我很疑惑,是书上说错了还是什么原因下面是SQLselect userid from (select userid,min(createtime) from LT_BIZORDER t where (t.status in (1,2,3,4,5) or (t.status=6 and t.endstatus in (0,1,2))) and createtime > to_date('2014-06-01','yyyy/MM/dd') group by t.userid order by min(createtime) asc) where rownum<=10000

解决方案

1.子查询是可以使用order by2.我测试了 select * from (子查询 order by) select * from table A where id not in (子查询 order by )都是可以的3、下面截取官档一段order by 和 rownum 一起用的范例!If you embed the ORDER BY clause in a subquery and place the ROWNUM condition in the top-level query, then you can force the ROWNUM condition to be applied after the ordering of the rows. For example, the following query returns the employees with the 10 smallest employee numbers. This is sometimes referred to as top-N reporting:SELECT * FROM (SELECT * FROM employees ORDER BY employee_id) WHERE ROWNUM < 11;
解决方案二:
当order by 与 rownum一起使用时,当然有意义,因为子查询的结果会影响到最终的返回结果集,并且在这种情况下,order by必须写在子查询里。但是就其他的情况而论,在子查询里写order by 没有实际意义,反而影响查询效率。你可以尝试执行一个子查询中带有Order by,且没有rownum的sql。执行后查看执行计划,你会发现执行计划里根本没有对子查询做order by操作,因为它也觉得这么做没有必要。
解决方案三:
可以用,只是最终结果不一样
解决方案四:
书上写错了。SELECT <expression list> [TOP <n>] FROM <model> [WHERE <condition list>] [ORDER BY <expression> [DESC|ASC]]里面[]表示根据实际需要可写可不写。最后说一句,书中不可能是都正确,随着对错误的纠正,也就了解的多了。
解决方案五:
当然影响啊,你from的张间接查询出来的表,由于该间接表已排好序,产生的结果当然受”间接表影响
解决方案六:
子查询是可以用order by的,并且这个orderby 会影响主查询的结果顺序。书上写错了。

时间: 2024-11-08 21:10:20

关于SQL子查询中使用order by的问题的相关文章

sql子查询中列别名在主查询中无效

问题描述 sql子查询中列别名在主查询中无效 CREATE PROCEDURE dbo.query_test( @i_begin_time varchar(128) IN, /* 开始时间 / @i_end_time varchar(128) IN, / 结束时间 / @i_bussiness_tpe varchar(512) IN, / 类型 ) as declare @v_sql varchar(16384)/* 定义 需要执行的sql / declare @Rtime varchar(12

SQL子查询实例

  SQL子查询实例介绍: 子查询是在一个查询内的查询.子查询的结果被DBMS使用来决定包含这个子查询的高级查询的结果.在子查询的最简单的形式中,子查询呈现在另一条SQL语句的WHERE或HAVING子局内. 列出其销售目标超过各个销售人员定额综合的销售点. SELECT CITY FROM OFFICES WHERE TARGET > (SELECT SUM(QUOTA) FROM SALESREPS WHERE REP_OFFICES = OFFICE) SQL子查询一般作为WHERE子句或

MySQL的子查询中FROM和EXISTS子句的使用教程_Mysql

FROM 子查询FROM 子句中的子查询 MySQL FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据.FROM 子查询语法如下: SELECT ... FROM (subquery) AS name ... 子查询会生成一个临时表,由于 FROM 子句中的每个表必须有一个名称,因此 AS name 是必须的.FROM 子查询也称为衍生数据表子查询. FROM 子查询实例 table1: s1 s2 1 5 2 12 3 20 FROM 子查询 SQL

关联-在线求大神解答,急SQL 子查询

问题描述 在线求大神解答,急SQL 子查询 我现在有两张表,表1和表2,表2里面有一个权限字段,权限1,权限2.权限3.我现在要用权限1的id 查出权限2,3和权限1有关联的ID.然后把这查出来的ID作为条件,在表1里面去查. select * from dbo.Ask_info where login_ID not in (select login_ID from dbo.Login where teacher_Contact in (select login_ID from dbo.Logi

T-SQL命令在SQL Server查询中的运用

server 首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的. 从表面上看,查询性能的调节是一件十分简单的事.从本质上讲,我们希望查询的运行速度能够尽可能地快,无论是将查询运行的时间从10分钟缩减为1分钟,还是将运行的时间从2秒钟缩短为1秒种,我们最终的目标都是减少运

sql连接查询中,where关键字的位置

最近一直在忙,也没有太多时间停留下来写博客.晚上遇到一个觉得很有趣的sql题,可能对初学者和我这种菜鸟会有帮助,所以决定分享给大家. 由于笔者天生笨拙,且思维不严谨,也实在不擅长写sql语句,高手请勿见笑,就请直接跳过本文吧. 背景就不多介绍了,先建表,插入测试数据吧.字段那些都有注释 --医生表 CREATE TABLE doctor ( id INT IDENTITY(1, 1) , --ID 自增长 docNumber NVARCHAR(50) NOT NULL , --医生编码 NAME

sql连接查询中,where关键字的位置讲解

由于笔者天生笨拙,且思维不严谨,也实在不擅长写sql语句,高手请勿见笑,就请直接跳过本文吧. 背景就不多介绍了,先建表,插入测试数据吧.字段那些都有注释复制代码 代码如下:--医生表CREATE TABLE doctor    (      id INT IDENTITY(1, 1) , --ID 自增长      docNumber NVARCHAR(50) NOT NULL , --医生编码      NAME NVARCHAR(50) NOT NULL   --医生姓名    )go --

sql子查询语句

子查询是嵌套在SELECT.INSERT.UPDATE和DELETE语句的WHERE子句和HAVING子句中的SELECT 语句. 它也可以嵌套在另一个子查询中. SELECT语句中子查询的语法格式为: 1.[NOT]IN子查询 这种语句的执行分两个步骤:首先执行内部子查询,然后根据子查询的结果再执行外层查询. SELECT title=CONVERT(char(25),title) FROM titles WHERE title_id IN (SELECT title_id FROM titl

SQL 子查询 请教

问题描述 先看一个例子,有如下3张表.CREATE TABLE course (cid BIGINT,cname VARCHAR(200));CREATE TABLE student (sid BIGINT,sname VARCHAR(200));CREATE TABLE student_course (scid BIGINT,sid BIGINT,cid BIGINT,score FLOAT);插入一些数据进去:1,"english"2,"math"3,"