如何将UNION ALL联合查询的结果存入新表中并排序

baije_530 2013-04-08 04:33:58
联合查询语句如下
select ch1_201301.dt as dt, ch1_201301.tie as tie from ch1_201301 where ch1_201301.dt between '2013-01-01 15:00:00' and '2013-02-28 15:00:00' union all select ch1_201302.dt as dt, ch1_201302.tie as tie from ch1_201302 where ch1_201302.dt between '2013-01-01 15:00:00' and '2013-02-28 15:00:00'order by dt

以上语句查询正常且查询结果按dt升序排列,如何将以上联合查询语句插入新表后是按dt升序排列

试过
select * into newTable from (select ch1_201301.dt as dt, ch1_201301.tie as tie from ch1_201301 where ch1_201301.dt between '2013-01-01 15:00:00' and '2013-02-28 15:00:00' union all select ch1_201302.dt as dt, ch1_201302.tie as tie from ch1_201302 where ch1_201302.dt between '2013-01-01 15:00:00' and '2013-02-28 15:00:00'order by dt) 提示子查询不能使用order by

改为select * into newTable from (select ch1_201301.dt as dt, ch1_201301.tie as tie from ch1_201301 where ch1_201301.dt between '2013-01-01 15:00:00' and '2013-02-28 15:00:00' union all select ch1_201302.dt as dt, ch1_201302.tie as tie from ch1_201302 where ch1_201302.dt between '2013-01-01 15:00:00' and '2013-02-28 15:00:00') as AA order by AA.dt 查询结果没有按dt排序,是乱的,有时排序正确,有时排序不正确。

如何修改语句可实现联合查询语句插入新表中后是按dt升序排序的,谢谢了
...全文
1333 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
szm341 2013-04-09
  • 打赏
  • 举报
回复
引用 26 楼 DBA_Huangzj 的回复:
并不保证就是说有一定几率出现而已,所以总会在后面补上一句:如果要保证顺序,需要指定order by子句这样类似的话。
QQQ
發糞塗牆 2013-04-09
  • 打赏
  • 举报
回复
引用 25 楼 szm341 的回复:
引用 24 楼 DBA_Huangzj 的回复: 没有顺序只是说,没有按照“物理存放的顺序而已”,它总有一个存放的顺序,只是不一定就是你“希望”的样子,并且忘了哪本书上也说过,不保证每次查询都是同一个顺序。另外说明一下,物理存放不是存在真正的磁盘的扇区上面,而是sqlos的概念而已。 也就是说,堆表查询是可以显示为插入顺序的,但是并不能保证一定是这样的顺序? 但是很纠结啊- -我见过的堆表……
并不保证就是说有一定几率出现而已,所以总会在后面补上一句:如果要保证顺序,需要指定order by子句这样类似的话。
szm341 2013-04-09
  • 打赏
  • 举报
回复
引用 24 楼 DBA_Huangzj 的回复:
没有顺序只是说,没有按照“物理存放的顺序而已”,它总有一个存放的顺序,只是不一定就是你“希望”的样子,并且忘了哪本书上也说过,不保证每次查询都是同一个顺序。另外说明一下,物理存放不是存在真正的磁盘的扇区上面,而是sqlos的概念而已。
也就是说,堆表查询是可以显示为插入顺序的,但是并不能保证一定是这样的顺序? 但是很纠结啊- -我见过的堆表没有一个不是按插入顺序显示的
發糞塗牆 2013-04-09
  • 打赏
  • 举报
回复
引用 20 楼 szm341 的回复:
引用 19 楼 DBA_Huangzj 的回复: 没有聚集索引的表没有顺序可言。除非你每次查询都指定order by 请教版主个问题~ 一般理论上堆表是无序的,但是为什么查询出来的数据总是按照插入的顺序显示呢?
没有顺序只是说,没有按照“物理存放的顺序而已”,它总有一个存放的顺序,只是不一定就是你“希望”的样子,并且忘了哪本书上也说过,不保证每次查询都是同一个顺序。另外说明一下,物理存放不是存在真正的磁盘的扇区上面,而是sqlos的概念而已。
逆天小北鼻 2013-04-09
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
没有聚集索引的表没有顺序可言。除非你每次查询都指定order by
恩,除非你每次查询都制定order by 。order by最好少用。
baije_530 2013-04-09
  • 打赏
  • 举报
回复
按SQL77提示的方法,问题解决了,创建了一个带聚合索引的字段新表,用insert into插入保证了顺序不乱。 谢谢各位的热心回复。
seusoftware 2013-04-09
  • 打赏
  • 举报
回复
union 的时候只要在最后加个order by就可以了 select堆表理论上应该是随机的,就好像 select top 100 * from table_name,不加where条件的话,是不能保证每次的结果都一样的。
szm341 2013-04-09
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
没有聚集索引的表没有顺序可言。除非你每次查询都指定order by
请教版主个问题~ 一般理论上堆表是无序的,但是为什么查询出来的数据总是按照插入的顺序显示呢?
弘恩 2013-04-09
  • 打赏
  • 举报
回复
引用 24 楼 DBA_Huangzj 的回复:
引用 20 楼 szm341 的回复:引用 19 楼 DBA_Huangzj 的回复: 没有聚集索引的表没有顺序可言。除非你每次查询都指定order by 请教版主个问题~ 一般理论上堆表是无序的,但是为什么查询出来的数据总是按照插入的顺序显示呢?没有顺序只是说,没有按照“物理存放的顺序而已”,它总有一个存放的顺序,只是不一定就是你“希望”的样子,并且忘了哪本书……
INSIDE里面,讲TOP的时候,有说过此种情况
發糞塗牆 2013-04-08
  • 打赏
  • 举报
回复
没有聚集索引的表没有顺序可言。除非你每次查询都指定order by
SQL77 2013-04-08
  • 打赏
  • 举报
回复
引用 16 楼 baije_530 的回复:
引用 14 楼 SQL77 的回复: 引用 13 楼 baije_530 的回复: 引用 9 楼 szm341 的回复: 引用 8 楼 baije_530 的回复: 这样一插入新表中,有时就乱了,有时正常,可能是你的数据少的原因,我这里数据有300W条 我拿了100w数据测试也是一样的,你是刚插入就查询看到有问题,还是插入后建了主键什么的后发现有问题? 先执行select * int……
把表弄成聚集表啊. 然后INSERT INTO 就成了.这样就能完全保证顺序.
baije_530 2013-04-08
  • 打赏
  • 举报
回复
引用 11 楼 Beirut 的回复:
刚才试了几次情况,排序没问题。你的语法应该这么写 SELECT ch1_201301.dt AS dt , ch1_201301.tie AS tie INTO newTable FROM ch1_201301 WHERE ch1_201301.dt BETWEEN '2013-01-01 15:0……
这个试了,也是有乱的情况
baije_530 2013-04-08
  • 打赏
  • 举报
回复
引用 14 楼 SQL77 的回复:
引用 13 楼 baije_530 的回复: 引用 9 楼 szm341 的回复: 引用 8 楼 baije_530 的回复: 这样一插入新表中,有时就乱了,有时正常,可能是你的数据少的原因,我这里数据有300W条 我拿了100w数据测试也是一样的,你是刚插入就查询看到有问题,还是插入后建了主键什么的后发现有问题? 先执行select * into newtable(select ..……
民该如何操作,请指点,谢谢了
SQL77 2013-04-08
  • 打赏
  • 举报
回复
堆内的数据页和行没有任何特定的顺序,也不链接在一起。数据页之间唯一的逻辑连接是记录在 IAM 页内的信息。 可以通过扫描 IAM 页对堆进行表扫描或串行读操作来找到容纳该堆的页的扩展盘区。因为 IAM 按扩展盘区在数据文件内存在的顺序表示它们,所以这意味着串行堆扫描连续沿每个文件进行。使用 IAM 页设置扫描顺序还意味着堆中的行一般不按照插入的顺序返回。
SQL77 2013-04-08
  • 打赏
  • 举报
回复
引用 13 楼 baije_530 的回复:
引用 9 楼 szm341 的回复: 引用 8 楼 baije_530 的回复: 这样一插入新表中,有时就乱了,有时正常,可能是你的数据少的原因,我这里数据有300W条 我拿了100w数据测试也是一样的,你是刚插入就查询看到有问题,还是插入后建了主键什么的后发现有问题? 先执行select * into newtable(select ...union all select...) as……
帮助文档明确指出了. 在与 SELECT...INTO 语句一起使用以从另一来源插入行时,ORDER BY 子句不能保证按指定的顺序插入这些行。
baije_530 2013-04-08
  • 打赏
  • 举报
回复
引用 9 楼 szm341 的回复:
引用 8 楼 baije_530 的回复: 这样一插入新表中,有时就乱了,有时正常,可能是你的数据少的原因,我这里数据有300W条 我拿了100w数据测试也是一样的,你是刚插入就查询看到有问题,还是插入后建了主键什么的后发现有问题?
先执行select * into newtable(select ...union all select...) as AA order by AA.dt后, 再执行selcet * from newtable查看插入后表的结果时,发现有时顺序是乱的,原表和表中都没有主键,
黄_瓜 2013-04-08
  • 打赏
  • 举报
回复
有些东西时间久了不用都记不清楚了,我是不是老了 退化了
黄_瓜 2013-04-08
  • 打赏
  • 举报
回复
刚才试了几次情况,排序没问题。你的语法应该这么写 SELECT ch1_201301.dt AS dt , ch1_201301.tie AS tie INTO newTable FROM ch1_201301 WHERE ch1_201301.dt BETWEEN '2013-01-01 15:00:00' AND '2013-02-28 15:00:00' UNION ALL SELECT ch1_201302.dt AS dt , ch1_201302.tie AS tie FROM ch1_201302 WHERE ch1_201302.dt BETWEEN '2013-01-01 15:00:00' AND '2013-02-28 15:00:00' ORDER BY dt
baije_530 2013-04-08
  • 打赏
  • 举报
回复
引用 6 楼 wszhongwen 的回复:
SQL code ? 1 select * into newTable from (select ch1_201301.dt as dt, ch1_201301.tie as tie from ch1_201301 where ch1_201301.dt between '2013-01-01 15:00:00' and '2013-02-28 15:00:00' union……
这样有时行,有时不行,不知道哪里有问题,搞了一下午了
szm341 2013-04-08
  • 打赏
  • 举报
回复
引用 8 楼 baije_530 的回复:
这样一插入新表中,有时就乱了,有时正常,可能是你的数据少的原因,我这里数据有300W条
我拿了100w数据测试也是一样的,你是刚插入就查询看到有问题,还是插入后建了主键什么的后发现有问题?
加载更多回复(8)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧