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

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

selecttop 20 *fromxxxwheretype=1orderbynewid() 

union 

selecttop 20 *fromxxxwheretype=0orderbynewid()

但是在sql 查询分析器种不对,语法有错,我乍一看,好像没有问题吧:

selecttop 20 *fromxxxwheretype=1orderbynewid() 单独执行 都是没有问题得;

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

去掉也是可以运行也没有错啊。也就是说在union子句中的查询不能用SQL Server Order by。但是这儿我必须要用order by啊,要不然我怎么取出随机的20条记录

最终改写成了:

SELECT * FROM 

(select TOP 20 * from dbo.AngelExam where (c='无' or c=null) and (d='无' or d=null) ORDER BY newid() ) a1 

UNION 

SELECT * FROM 

(select TOP 20 * from dbo.AngelExam where (c='无' or c=null) and (d='无' or d=null) ORDER BY newid()) a2 

看着语句长了不少,有点怪怪得,但是没法,不知道为什么SQL Server中不能在union子句中使用order by,所以只有外围在包装一层了。

到此这篇关于SQL Server2008 Order by在union子句不可直接使用的原因详解的文章就介绍到这了,更多相关SQL Server2008 Order by在union子句不可直接使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • sqlserver Union和SQL Union All使用方法

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须相同. SQL UNION 语法SELECT column_name(s) FROM table_name1UNIONSELECT column_name(s) FROM table_name2 注释:默认地,UNION 操作符选取不同的值,即UNION是去了重

  • SQLSERVER中union,cube,rollup,cumpute运算符使用说明

    /* --1 UNION 运算符是将两个或更多查询的结果组合为单个结果集 使用 UNION 组合查询的结果集有两个最基本的规则: 1.所有查询中的列数和列的顺序必须相同. 2.数据类型必须兼容 a.UNION的结果集列名与第一个select语句中的结果集中的列名相同,其他select语句的结果集列名被忽略 b.默认情况下,UNION 运算符是从结果集中删除重复行.如果使用all关键字,那么结果集将包含所有行并且不删除重复行 c.sql是从左到右对包含UNION 运算符的语句进行取值,使用括号可以

  • 深入SQL SERVER合并相关操作Union,Except,Intersect的详解

    对于结果集有几个处理,值得讲解一下1. 并集(union,Union all)这个很简单,是把两个结果集水平合并起来.例如SELECT * FROM AUNIONSELECT * FROM B[注意]union会删除重复值,也就是说A和B中重复的行,最终只会出现一次,而union all则会保留重复行. 2. 差异(Except)就是两个集中不重复的部分.例如SELECT * FROM AEXCEPTSELECT * FROM B这个的意思是,凡是不出现在B表中的A表的行. 3. 交集(inte

  • SQL Server2008 Order by在union子句不可直接使用的原因详解

    按照要求,每个取top 20,既然是随机的取,那么就SQL Server Order by newid()就是了,然后把所有数据union起来就得了.所以我立即给出了答案: selecttop 20 *fromxxxwheretype=1orderbynewid() union selecttop 20 *fromxxxwheretype=0orderbynewid() 但是在sql 查询分析器种不对,语法有错,我乍一看,好像没有问题吧: selecttop 20 *fromxxxwherety

  • MySQL利用UNION连接2个查询排序失效详解

    概述 UNION 连接数据集关键字,可以将两个查询结果集拼接为一个,会过滤掉相同的记录 UNION ALL 连接数据集关键字,可以将两个查询结果集拼接为一个,不会过滤掉相同的记录 今天在接到一个需求的时候使用了UNION进行查询后发现,如果两个查询分别使用ORDER BY后拼接居然无法成功排序,经过了好一番折腾,记录下 表结构及数据 -- 创建表 CREATE TABLE test_user ( ID int(11) NOT NULL AUTO_INCREMENT, USER_ID int(11

  • 用SQL实现统计报表中的"小计"与"合计"的方法详解

    客户提出需求,针对某一列分组加上小计,合计汇总.网上找了一些有关SQL加合计的语句.都不是很理想.决定自己动手写.思路有三个:1.很多用GROUPPING和ROLLUP来实现.  优点:实现代码简洁,要求对GROUPPING和ROLLUP很深的理解.  缺点:低版本的Sql Server不支持. 2.游标实现.  优点:思路逻辑简洁.  缺点:复杂和低效. 3.利用临时表.  优点:思路逻辑简洁,执行效率高.SQL实现简单.  缺点:数据量大时耗用内存. 综合三种情况,决定"利用临时表"

  • PostgreSQL对GROUP BY子句使用常量的特殊限制详解

    一.问题描述 最近,一个统计程序从Oracle移植到PostgreSQL(版本9.4)时,接连报告错误: 错误信息1: postgresql group by position 0 is not in select list. 错误信息2: non-integer constant in GROUP BY. 产生错误的sql类似于: insert into sum_tab (IntField1, IntField2, StrField1, StrField2, cnt) select IntFi

  • MySQL索引失效原因以及SQL查询语句不走索引原因详解

    目录 前言 1. 隐式的类型转换,索引失效 2. 查询条件包含 or,可能导致索引失效 3. like 通配符可能导致索引失效 4. 查询条件不满足联合索引的最左匹配原则 5. 在索引列login_time上使用 mysql 的内置函数 6. 对索引列age进行列运算(如,+.-.*./), 索引不生效 7. 索引字段age上使用(!= 或者 < >, not in),索引可能失效 8. 索引字段上使用 is null, is not null,索引可能失效 (查询结果行数) 9. 左右joi

  • 探讨:sql插入空,默认1900-01-01 00:00:00.000的解决方法详解

    sql2005 若字段定义的类型为datetime,插入为''(空),那么会默认值为1900-01-01 00:00:00.000 解决方法查询的时候过滤下cast(nullif('','') as datetime) 复制代码 代码如下: select cast('' as datetime)    , cast(nullif('','') as datetime)    , isnull(cast(nullif('','') as datetime),getdate())/*--------

  • sql中的left join及on、where条件关键字的区别详解

    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN. 创建两张表并插入一些

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

    本文实例讲述了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

  • LINQ基础之Join和UNION子句

    Join子句 一.简介 使用join子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联,唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值,join子句使用特殊的equals关键字比较指定的键是否相等. 二.案例 内部连接 var innerJoinQuery = from category in categories join prod in products on category.ID equals prod.CategoryID select new {

  • 解决sql server2008注册表写入失败,vs2013核心功能安装失败

    前天入手了一块三星SSD,然后迫不及待的更换到电脑上,结果就在安装系统的时候出了差错,整个过程折磨了我整整一天,让我深深地感受到了来自地狱的恶意. 既然得到了块好硬盘,就打算装上win10系统,把之前的win8.1系统留着备用,可是安装系统选择分区的时候选错了区,选择了之前win8.1所在的C盘,ghost一键装机之后我才发现好像选择错了分区,赶紧点击取消,原以为会没事,后来发现C盘已经被格式化了,他奶奶个腿的,重新选择分区之后一直顺利的安装好了系统. 然后安装工作软件sql server200

随机推荐