添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

首先,在程序人生网站上,需要负责任的指出的是在SQL Server查询中使用Union或Union All后Order by排序无效,我不确认是不是微软的bug,不过这里却是我实际编程工作的经验,但愿大家看到这篇文章后,不要再走弯路,不要再为做一个快乐的程序员而苦恼。

下面以可操作性的代码说明这个bug,权且先认为是bug吧。
比如有一张学生表student 和教师表 teacher , 我们要查询所有的教师学生的姓名和年龄,教师排前面,学生排后面,分别按字母顺序,则可能会想写一个这样的Sql语句: (注意,这个语句只是为了说明问题,这并不是一个正确的语句)

SELECT Name,Age FROM Teacher ORDER BY Name 
UNION 
SELECT Name,Age FROM Student ORDER BY Name

实际上,MSSQL并不允许我们写这样的语句,因此将会报错 UNION 附近有语法错误.

其实我们只需要绕开,让ORDER BY 和UNION 不在同一层, 让ORDER 在子查询内而 UNION 在外面(因为我们要先教师学生分开,然后再名字) 这样得到了另外一个Sql语句:(注意,这依然不是一个正确的语句)

SELECT * FROM (SELECT Name,Age FROM Teacher ORDER BY Name) A 
UNION 
SELECT * FROM (SELECT Name,Age FROM Student ORDER BY Name) B

这句Sql语句依然无法通过,因为这又触犯了MSSQL的另外一条语法规定,在子查询中, 如果不存在TOP语句则ORDER BY子句无效. 但是我们需要的是全部结果,并不需要TOP的功能. 显然, TOP 100% 是个解决的方法. 因为100%就是全部了.

最后,这条蹩脚的Sql语句出炉了:

SELECT * FROM (SELECT TOP 100 PERCENT Name,Age FROM Teacher ORDER BY Name) A 
UNION 
SELECT * FROM (SELECTTOP 100 PERCENT Name,Age FROM Student ORDER BY Name) B

这就是最后的结果, 为了让ORDER BY 和UNION同时发挥作用,绕了2个弯.

如果想Union前面和后面的集合分开,使用Union all,但要去除重复的记录。

但是在使用Union All的时候需要特别注意,在使用Union All的时候,上面讲到的规则,也就是Order by 仍然会失效。

让程序员朋友们又苦恼了吧,下面的解决方法就是重点了。

Select TOP 99.999999 PERCENT Name,Age FROM Teacher ORDER BY Name

在使用了99.999999这个特殊数字后,该问题最终得到解决 ,真是神奇啊。

另外补充一点:UNION和UNION ALL的区别 ,UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。(应该就是这种算法让程序员自己编码的Order by排序失效了)。

UNION ALL只是简单的将两个结果集进行链接返回,所以如果我们只是为了链接两个结果集,只要用UNION ALL就可以了,并且从效率上来说UNION ALL也比UNION快,因为它不需要进行筛选排重的。

原文链接:https://blog.csdn.net/mituan1234567/article/details/22305235/ 嵌套查询语法格式带有IN谓词的子查询IN谓词实现交运算IN谓词实现差运算带有比较运算符的子查询带有ANY谓词的子查询带有ALL谓词的子查询相关子查询引用子查询的值不引用子查询的值(EXISTS)基于派生表的查询 SELECT 列名表达式 FROM 表名 WHERE 表达式 运算符 (SELECT 子查询) 其运算符包含IN、关系运算符、ANY、ALL、EXISTS五类 1.SQL允许多层嵌套查询 2.子查询不能使用ORDER BY子句(但可以使用GROUP BY等分组查询) 带有IN谓词的子查询 带有IN谓词的子查询指父查询与子查询之间用IN进行连接,判断某个属性列值是 (select t2.goods_id  goods_id from 1dcq_goods t2 order by t2.goods_id desc ) 如上sql语句,结果如下,可以看出是没有顺序的: 下面语句: 不过SQLServer不支持这样操作, 原因是orderby的优先级比unionall要低,所以一旦同时出新orderunion 会先执行union,再执行order MySQl 使用union合并查询排序被打乱了 用uni... 需求:有一张linkman表,查询结果分为三个部分,第一个部分id为6、8、9的按照年龄降序,第二部分第一部分剩余的人且id∈[8,15],按年龄降序排序,剩余的为第三部分,按年龄降序排序。 表结构如下: -- Create Table CREATE TABLE `linkman` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `sex` varchar(50) DEFAULT NULL, 一.先连接后排序 1.连接排序时,无论有多少个union/union all的部分,只有最后一个union/union all部分才能拥有一个order by子句 2.union/union all的order by子句只能通过列号或别名来标示你要排序的字段 例: select t1.account_id account_id,t1.account_name account_name fro... 遇到的问题: 一个sqlunion了几个子查询。单独执行每个子查询都没问题,但union后执行,报 ORA-00904: "xxx": invalid identifier 关于union使用SQL: UNION Query: http://www.techont... INSERT INTO T_Test VALUES (1,'a') INSERT INTO T_Test VALUES (2,'-') INSERT INTO T_Test VALUES (3,'b') INSERT INTO T_Test VA... 1、对union all的每个查询分别排序 现在有A表的数据和B表的数据,现需要将两个表的数据按照一定的条件进行查询之后,将两个结果集并起来,而且查询之后的数据是不会混在一起的,结果集先是A表后是B表。 另外,如果对这两个表的查询数据的排序条件不一样,需要分别排序,那么相关代码如下: 1)如果这种写法就会报错: select a,b from tablea where … order by a... 在查询过程,可能会遇到 多条sql语句进行合并查询,合并查询之后子查询order by 排序功能无效 自己亲测 子查询使用 select * from T2 union all select * from ( select TOP 99.999999 PERCENT * from T1 order by name SQL用了Union排序应该怎么实现 最近使用SQL语句进行UNION查询,惊奇的发现:SQL没问题,UNION查询也没问题,都可以得到想要的结果,可是在对结果进行排序的时候,却出问题了。 日常开发,如果实用UNION ALL合并两个已经排好序的结果集的时候,需求是第二个结果集数据排在第一个结果集数据下面,单纯的实用order by是无效的,因为order by的优先级比UNION ALL低。 1.UNION查询没问题 SELECT `id`,`username`,`mobile`,`time`