首先,在程序人生网站上,需要负责任的指出的是在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要低,所以一旦同时出新order和union
会先执行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...
遇到的问题:
一个sql中,union了几个子查询。单独执行每个子查询都没问题,但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`