SQL Server Order by在union子句不可直接使用的原因

数据库 SQL Server
以下的文章主要向大家描述的是SQL Server Order by不可以直接在union子句中对其进行使用的原因,以下就是文章的主要内容的详细描述。

此文章主要讲述的是SQL Server Order by不可以直接在union子句中对其进行使用的原因,今天一个群中的朋友提出了一个问题,说有一个表,表中存在很多的相关数据,其中有个字段type,希望从表中随机取出10条记录,其中有5条type=1另外5条type=0,比如下图这样:

SQL Server Order by不能直接在union子句中使

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

  1. select top 5 * from xxx where type=1 order by newid()   
  2. union   
  3. select top 5 * from xxx where type=0 order by newid()  

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

  1. CREATE TABLE [dbo].[Question](   
  2. [id] [int] IDENTITY(1,1) NOT NULL,   
  3. [question] [varchar](50) NOT NULL,   
  4. [answer] [varchar](50) NOT NULL,   
  5. [type] [bit] NOT NULL,   
  6. CONSTRAINT [PK_Question] PRIMARY KEY CLUSTERED   
  7. (   
  8. [id] ASC   
  9. )WITH (PAD_INDEX = OFFSTATISTICS_NORECOMPUTE = OFFIGNORE_DUP_KEY = OFF,  
  10. ALLOW_ROW_LOCKS = ONALLOW_PAGE_LOCKS = ON) ON [PRIMARY]   
  11. ) ON [PRIMARY]   

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

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

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

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

  1. (select top 5 * from dbo.Question   
  2. where [type]=1   
  3. )   
  4. UNION   
  5. (select top 5 * from dbo.Question   
  6. where [type]=0   
  7. )  

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

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

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

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

以上的相关内容就是对SQL Server Order by不能直接在union子句中使用的介绍,望你能有所收获。

【编辑推荐】

  1. MS SQL Server问题与其正确解答方案
  2. SQL Server 数据导入的实际行为规范描述
  3. SQL Server 2000的安全策略的正确打造
  4. SQL Server DateTime数据类型的另类解读
  5. SQL Server identity列,美中不足之处
责任编辑:佚名 来源: csdn.net
相关推荐

2010-11-11 16:53:28

SQL Server视

2010-11-09 10:10:08

SQL Server

2011-08-24 11:22:38

SQL ServerUNION代替OR

2010-09-06 11:24:32

SQL Server语句

2011-07-29 15:31:52

Oracle数据库ORDER BY

2011-08-29 11:38:18

SQL Server 联合结果集union

2011-07-28 16:16:27

MySQL数据库索引ORDER BY

2011-08-16 16:10:12

MySQLORDER BY子句GROUP BY子句

2010-09-26 09:50:36

SQL Where子句

2010-07-20 08:35:54

SQL Server锁

2010-11-09 16:29:39

SQL Server死

2011-04-01 14:43:14

SQL Server不可见字符

2010-09-26 14:46:19

SQL WHERE子句

2010-09-16 09:49:38

sql server建

2010-07-02 10:53:32

SQL Server死

2010-07-23 11:35:03

SQL Server置

2011-04-02 16:39:53

SQL Server查询

2010-11-12 11:19:19

SQL Server视

2010-07-22 10:02:12

SQL Server置

2010-09-08 15:42:46

SQL指令UNION
点赞
收藏

51CTO技术栈公众号