union 如何对结果进行排序?

djfu 2008-06-08 04:21:57
create table test
(
begindate datetime ,
enddate datetime,
no int,
name varchar(30)
)

我现在要条件查询:
1)如果begindate 是在2008-01-01 00:00:00至2008-01-01 00:00:01之间的,则只取no>1000的记录前100条,按照begindate升序、no升序排序
2) 如果begindate大于2008-01-01 00:00:01的,取前100条,按照begindate升序、no升序排序

对1)2)的查询进行合并union,按照begindate升序、no升序排序,取结果集里面的前100条。


SQL 语句如何实现?
...全文
215 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
正宗老冉 2008-06-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 djfu 的回复:]
用with的话SQL 语句怎么写的?
[/Quote]


WITH T1 AS ( SELECT TOP 100 * FROM test WHERE begindate BETWEEN '2008-01-01 00:00:00' AND '2008-01-01 00:00:01' AND no>1000 ORDER BY begindate, no)
, T2 AS (SELECT TOP 100 * FROM test WHERE begindate > '2008-01-01 00:00:01' AND no>1000 ORDER BY begindate, no)

SELECT TOP 100 * FROM T1 UNION SELECT TOP 100 * FROM T2 ORDER BY begindate, no
djfu 2008-06-08
  • 打赏
  • 举报
回复
用with的话SQL 语句怎么写的?
正宗老冉 2008-06-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 djfu 的回复:]
一定要临时表才可以吗?
[/Quote]

2005的话,WITH 也可以。
djfu 2008-06-08
  • 打赏
  • 举报
回复
一定要临时表才可以吗?
正宗老冉 2008-06-08
  • 打赏
  • 举报
回复

SELECT TOP 100 * INTO #T1 FROM test WHERE begindate BETWEEN '2008-01-01 00:00:00' AND '2008-01-01 00:00:01' --备注:时间范围是1秒?
AND no>1000
ORDER BY begindate, no

SELECT TOP 100 * INTO #T2 FROM test WHERE begindate > '2008-01-01 00:00:01' AND no>1000
ORDER BY begindate, no

SELECT TOP 100 * FROM #T1
UNION SELECT TOP 100 * FROM #T2
ORDER BY begindate, no

DROP TABLE #T1
DROP TABLE #T2
正宗老冉 2008-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 djfu 的回复:]
楼上的不对啊,


C/C++ code
消息 156,级别 15,状态 1,第 9 行
关键字 'UNION' 附近有语法错误。
消息 102,级别 15,状态 1,第 16 行
')' 附近有语法错误。


是的,时间是1秒的范围差。
[/Quote]

我搞点数据试试,然后再给你结果。
另,SQL Server 的datetime类型有3毫秒的误差,1秒级的时间范围精度我很担心。。
djfu 2008-06-08
  • 打赏
  • 举报
回复
楼上的不对啊,


消息 156,级别 15,状态 1,第 9 行
关键字 'UNION' 附近有语法错误。
消息 102,级别 15,状态 1,第 16 行
')' 附近有语法错误。



是的,时间是1秒的范围差。
正宗老冉 2008-06-08
  • 打赏
  • 举报
回复
SELECT TOP 100 * FROM 
(
SELECT * FROM
(
SELECT TOP 100 * FROM test WHERE begindate BETWEEN '2008-01-01 00:00:00' AND '2008-01-01 00:00:01' --备注:时间范围是1秒?
AND no>1000
ORDER BY begindate, no
)
UNION
SELECT * FROM
(
SELECT TOP 100 * FROM test
WHERE begindate > '2008-01-01 00:00:01' AND no>1000
ORDER BY begindate, no
)
)
ORDER BY begindate, no

34,590

社区成员

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

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