CREATE table T_Test(
Id int not null ,
name nvarchar(50) not null
)
INSERT INTO T_Test VALUES (1,'a')
INSERT INTO T_Test VALUES (2,'-')
INSERT INTO T_Test VALUES (3,'b')
INSERT INTO T_Test VALUES (4,'c')
INSERT INTO T_Test VALUES (4,'+')
/*
SELECT * from T_Test
Id name
1 a
2 -
3 b
4 c
4 +
*/
一、问题:如果想要得到一个结果集是T_Test按照name正序排列,并且特殊符号放置字母后
1.
SELECT * FROM (SELECT TOP 100 percent * from T_Test where name >= 'A' ORDER BY name ) a
union ALL
SELECT * FROM (SELECT TOP 100 percent * from T_Test where name < 'A' ORDER BY name ) b
结果为:
Id name
1 a
3 b
4 c
2 –
4 +
说明:union ALL不去重不排序,所以效率比union高,符合结果
2.
SELECT * FROM (SELECT TOP 100 percent * from T_Test where name >= 'A' ORDER BY name ) a
union
SELECT * FROM (SELECT TOP 100 percent * from T_Test where name < 'A' ORDER BY name ) b
结果为:
Id name
1 a
2 –
3 b
4 +
4 c
说明:UNION去重且排序,Union将会按照字段的顺序进行排序,这样结果不是想要的,
如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
二、关于union,或union all子句中排序ORDER BY用法,下面写法是语法错误的
SELECT * from T_Test where name >= 'A' ORDER BY name
union ALL
SELECT * from T_Test where name < 'A' ORDER BY name
以下面sql为例
SELECT * FROM (SELECT TOP 100 percent * from T_Test where name >= 'A' ORDER BY name ) a
union ALL
SELECT * FROM (SELECT TOP 100 percent * from T_Test where name < 'A' ORDER BY name ) b
正确结果,必须要嵌套一层SELECT * FROM (SELECT TOP 100 percent * from T_Test where name >= ‘A’ ORDER BY name ) a
如果去掉“TOP 100 percent”,则会抛出异常“除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效”
欢迎加群,日用儿童母婴分享大牌淘宝京东优惠券
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34222.html