寻最优SQL查询算法

天-笑 2013-11-09 09:33:39
比如有个表表结构如下:
---------------------------------------------
序号(Int) 起号(int) 止号(int)
1 1 4
2 7 9
3 5 6
4 11 13
5 14 20
-------------------------------------------------
需要查询出结果(2行)

序号(Int) 起号(int) 止号(int)
1 1 9
4 11 20

请问有什么好办法,效率要高!
...全文
231 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
iailum 2013-11-11
  • 打赏
  • 举报
回复
我能想到的都在下面了,效率和最优我分析不来,供你参考测试
CREATE TABLE T
(
  序号 int,
  起号 int,
  止号 int
)

INSERT INTO T
SELECT 1,1,4
UNION ALL
SELECT 2,7,9
UNION ALL
SELECT 3,5,6
UNION ALL
SELECT 4,11,13
UNION ALL
SELECT 5,14,20

--方案1
;WITH CTE
AS
(
  SELECT A.*
  FROM T A
  WHERE NOT EXISTS(SELECT 1 FROM T WHERE 止号=A.起号-1)
  UNION ALL
  SELECT Y.序号,NULL,X.止号
  FROM T X
  JOIN CTE Y ON X.起号=Y.止号+1
)
SELECT 序号,起号=MIN(起号),止号=MAX(止号)
FROM CTE
GROUP BY 序号
/*
序号	起号	止号
1	    1	    9
4	    11	    20
*/
--方案2
;WITH CTE1
AS
(
  SELECT A.序号,A.起号,连接序号=ROW_NUMBER()OVER(ORDER BY 起号)
  FROM T A
  WHERE NOT EXISTS(SELECT 1 FROM T WHERE 止号=A.起号-1)
),
CTE2
AS
(
  SELECT B.止号,连接序号=ROW_NUMBER()OVER(ORDER BY 止号)
  FROM T B
  WHERE NOT EXISTS(SELECT 1 FROM T WHERE 起号=B.止号+1)
)
SELECT C.序号,C.起号,D.止号
FROM CTE1 C
JOIN CTE2 D ON C.连接序号=D.连接序号
/*
序号	起号	止号
1	    1	    9
4	    11	    20
*/
--方案3,这里我也拿不准是TOP(1)配合ORDER BY效率高还是MIN效率高
;WITH CTE1
AS
(
  SELECT A.序号,A.起号
  FROM T A
  WHERE NOT EXISTS(SELECT 1 FROM T WHERE 止号=A.起号-1)
),
CTE2
AS
(
  SELECT B.止号
  FROM T B
  WHERE NOT EXISTS(SELECT 1 FROM T WHERE 起号=B.止号+1)
)
SELECT *,止号=(SELECT MIN(止号) FROM CTE2 WHERE 止号>CTE1.起号)
FROM CTE1
guguda2008 2013-11-10
  • 打赏
  • 举报
回复
CTE是解决这种问题最快的方法,没有之一。前提是内存足够容纳结果。。。。
天-笑 2013-11-10
  • 打赏
  • 举报
回复
还有更好的么? 我的目标 寻找最优的查询效率
haitao 2013-11-09
  • 打赏
  • 举报
回复
;with t as
select fb,fe from tb
union all
select a.fb,b.fe from t a
left join tb b on a.fe=b.fa-1

select min(fa),fb from (
select fa,max(fb) fb
from t
group by fa
) a
group by fb
haitao 2013-11-09
  • 打赏
  • 举报
回复
;with t as
select fb,fe from tb
union all
select a.fb,b.fe from t a
left join tb b on a.fe=b.fa-1

select fa,max(fb)
from t
group by fa
还需进一步加工。。。。
天-笑 2013-11-09
  • 打赏
  • 举报
回复
楼上,就是把 各号段,连成一个完整的号段。 比如 1-4 与5-6 与7-9 刚好连成 1-9
szm341 2013-11-09
  • 打赏
  • 举报
回复
你这也没说由什么条件得出的结果,单看结果还真看不明白
iailum 2013-11-09
  • 打赏
  • 举报
回复
我能想到就3种方法吧,效率不知道那种好 但是家里没SQL测试不了,下周上班要是还没结题我再来测试了回复吧

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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