100分求高效SQL!!!

clop 2006-06-23 03:13:49
应用很简单
表1 卡号明细(card_no, send_id)
SAETR00001 null
SAETR00002 1
SAETR00003 1
SAETR00004 null
SAETR00005 null
SAETR00006 2
SAETR00007 null
SAETR00008 null

表2 发送单 (send_id, start_card_no, end_card_no)
1 SAETR00002 SAETR00003
2 SAETR00006 SAETR00006


求清单
send_id start_card_no, end_card_no
null SAETR00001 SAETR00001
1 SAETR00002 SAETR00003
null SAETR00004 SAETR00005
2 SAETR00006 SAETR00006
null SAETR00007 SAETR00008


做法有很多种,循环就不考虑,主要想要高效的
谢谢
...全文
232 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2006-06-23
  • 打赏
  • 举报
回复
那倒不一定,将'SAETR'几个字符去掉,转为INT型,就可以直接在范围里取了。
zcyan666 2006-06-23
  • 打赏
  • 举报
回复
同意二楼
LouisXIV 2006-06-23
  • 打赏
  • 举报
回复
估计是03 被设定为1的可能较大

不过这样的查询肯定要遍历全表匹配,速度是怎么也上不到哪里去的
fcuandy 2006-06-23
  • 打赏
  • 举报
回复
子陌老大写的真快,我刚想完楼主的要求,你把结果都写出来了。
fcuandy 2006-06-23
  • 打赏
  • 举报
回复
光看楼主这几条数据,写法有多种,也不难。
但我想问一下楼主,如果发送单第一数据是
1 SAETR00002 SAETR00004 --将03改为了04

那么清单中
03的 send_id 为null还是为1或者根本不出现 03?
也即是问,你的 start_card_no和end_card_no界定了一个卡号的范围,还是仅指两个卡号?
LiBin_OberthurCS 2006-06-23
  • 打赏
  • 举报
回复
select * from 发送单
union all
select
null,c.card_no,min(d.card_no)
from
(select
a.*
from
卡号明细 a
where
a.send_id is null
and
not exists(select 1 from 卡号明细 where right(card_no,5)=right(a.card_no,5)-1 and send_id is null)) c,
(select
b.*
from
卡号明细 b
where
b.send_id is null
and
not exists(select 1 from 卡号明细 where right(card_no,5)=right(b.card_no,5)+1 and send_id is null)) d
where
c.card_no<=d.card_no
group by
c.card_no
order by
start_card_no

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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