order by居然不能直接在union子句中使用

今天一个群中的兄弟问一个问题,说有一个表,表中有很多数据,其中有个字段type,希望从表中随机取出10条记录,其中有5条type=1另外5条type=0,比如下图这样:


我一想,这还不简单,按照要求,每个取top 5,既然是随机的取,那么就order by newid()就是了三,然后把所有数据union起来就得了。所以我立即给出了答案:

select top 5 * from xxx where type=1 order by newid()

union

select top 5 * from xxx where type=0 order by newid()

但是那个兄弟说不对,语法有错,我乍一看,好像没有问题把,于是让他把表定义发给我,我在本机试一下,表定义是:

CREATE TABLE [dbo].[Question](
[id] [int] IDENTITY(1,1) NOT NULL,
[question] [varchar](50) NOT NULL,
[answer] [varchar](50) NOT NULL,
[type] [bit] NOT NULL,
CONSTRAINT [PK_Question] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

于是将我的语句输进SSMS,结果系统还真是报错了:Incorrect syntax near the keyword 'ORDER'.

怎么回事啊?怎么看也不像有问题的啊。于是我单独执行

select top 5 * from dbo.Question
where [type]=1
ORDER BY newid()

对的啊。没有问题,下面的半句也是一样的语法结构,也没有错误。但是把这两个查询union起来就错了。奇怪啊。既然提示是order附近有错,那么我将order给去掉:

(select top 5 * from dbo.Question
where [type]=1
)
UNION
(select top 5 * from dbo.Question
where [type]=0
)

也没有错啊。也就是说在union子句中的查询不能用order by。但是这儿我必须要用order by啊,要不然我怎么取出随机的5条记录?不用union可以不?可以啊,创建一个临时表,将查询出来的5条数据插进去,另外5条也是。然后再查询临时表,但是能不使用临时表就尽量不要使用临时表,何必弄的那么复杂。

又要用order by 又要用union,怎么办?order by不能直接出现在union的子句中,但是可以出现在子句的子句中啊!于是查询最终改写成了:

SELECT * FROM
(select TOP(5) * from dbo.Question where [type]=1 ORDER BY newid() ) t1
UNION
SELECT * FROM
(select TOP(5) * from dbo.Question where [type]=0 ORDER BY newid()) t2

感觉有点别扭,但是没法,不知道为什么SQL Server中不能在union子句中使用order by,所以只有出此下策了。

时间: 2024-08-03 18:45:57

order by居然不能直接在union子句中使用的相关文章

为何Order by不能直接在union子句中使用

今天一个群中的兄弟问一个问题,说有一个表,表中有很多数据,其中有个字段type,希望从表中随机取出10条记录,其中有5条type=1另外5条type=0,比如下图这样: 我一想,这还不简单,按照要求,每个取top 5,既然是随机的取,那么就order by newid()就是了三,然后把所有数据union起来就得了.所以我立即给出了答案: select top 5 * from xxx where type=1 order by newid() union select top 5 * from

MySQL中Union子句不支持order by的解决方法_Mysql

本文实例讲述了MySQL中Union子句不支持order by的解决方法.分享给大家供大家参考,具体如下: 我对DB知之甚少,这问题只在MySQL遇到,不知道别的DBMS是不是也如此. 问题是这样的,我打算在一个表里获得与某一行记录相邻的两行,并且想通过union一起取出来,所以这么写: select id,title from subjects where id>#some_id# order by id limit 1 union select id,title from subjects

select-关于SELECT 子句中包含一个保留字、拼写错误或丢失的参数,或标点符号不正确

问题描述 关于SELECT 子句中包含一个保留字.拼写错误或丢失的参数,或标点符号不正确 MstrSelectSql = ""SELECT StuInfo.NO AS 学号StuInfo.Name AS 姓名StuInfo.Sex AS 性别StuInfo.BirDate AS 出生日期StuInfo.PolType AS 政治面貌StuScore.English AS 大学英语StuScore.Computer AS 计算机StuScore.Math AS 大学高等数学StuScor

选择列表中的列 '***' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

错误提示: 消息 8120,级别 16,状态 1,第 2 行 选择列表中的列 'Qiu.dbo.students.name' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中. 解决方案: 如果 SELECT 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每个组的汇总值.指定 GROUP BY 时,选择列表中任何非聚合表达式内的每个属性名都应包含在GROUP BY列表中,或者GROUP BY表达式必须与选择列表表达式完全匹配. 错误用法: SELEC

Oracle中where子句和having子句中的区别

本文使用字段为oracle数据库中默认用户scott下面的emp表,sal代表员工工资,deptno代表部门编号.   一.聚合函数    聚合函数有时候也叫统计函数,它们的作用通常是对一组数据的统计,比如说求最大值,最小值,总数,平均值如MAX,MIN,COUNT, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多条记录上.简单举个例子:SELECT SUM(sal) FROM emp,这里的SUM作用是统计emp表中sal(工资)字段的总和,结果就是该查询只返回一个结果,即工资总和

SELECT 子句中包含一个保留字、拼写错误或丢失的参数,或标点符号不正确......????

问题描述 下面这样正常:strComm="selecttop10*fromregtablewhere(s_zhong='未中奖'ors_zhong=''ors_zhongisnull)ands_time>=@timeFromands_time<=@timeTo";System.Data.OleDb.OleDbParameter[]paras=newSystem.Data.OleDb.OleDbParameter[2];paras[0]=newSystem.Data.OleD

[转] LINQ的经典例子-Where,Select、SelectMany、SkipWhile子句中使用数组索引。

Where 子句的用法 我们除了可以如下方式书写带Where子句的LINQ外: from p in products where p.UnitsInStock > 0 && p.UnitPrice > 3.00M select p; 还可以对数组(所有实现了IEnumerable接口的对象都可以)的实体使用 Where 扩展方法.   把一个查询语句写成多个扩展函数的方式,这其实是编译器处理查询语句的方法,比如下面的查询语句: int[] arr = new int[] { 8

Oracle性能优化学习笔记之WHERE子句中的连接顺序

        ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.         例如:        (低效,执行时间156.3秒) SELECT - FROM EMP E WHERE SAL > 50000 AND JOB = 'MANAGER' AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);      

mysql &amp;quot;group by&amp;quot;与&amp;quot;order by&amp;quot;的研究--分类中最新的内容_数据库其它

这两天让一个数据查询难了.主要是对group by 理解的不够深入.才出现这样的情况 这种需求,我想很多人都遇到过.下面是我模拟我的内容表 复制代码 代码如下: CREATE TABLE `test` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `category_id` INT(10) NOT NULL, `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMES