还是那个循环递归,又有新的需求

minajo21 2005-02-16 10:53:40
前面的问题都已解决,先谢谢了!

http://community.csdn.net/Expert/topic/3778/3778627.xml?temp=.2893335

现在有个新的需求,也很变态:

有个主表 tbl_lcinfo:

lcid dealtime 其他字段 ...
-------------------- ------------------------ ----------
20050120153336359959 2005-01-26 12:41:49.000
20050124145844968972 2005-01-24 14:58:44.000
20050124150749109982 2005-01-24 15:07:49.000
20050124152907140795 2005-01-24 15:29:07.000
20050124162418734220 2005-01-24 16:24:18.000
20050125093058656827 2005-01-25 09:30:58.000
20050125093221968158 2005-01-25 09:32:21.000
20050125093343203803 2005-01-25 09:33:43.000
20050125093422484710 2005-01-25 09:34:22.000

关系表:tbl_LcAssociation:
Lc1 Lc2 AssociationType
------------------------------------------------
20050131164410984641 20050131164432421370 05
20050131164410984641 20050131164543968868 02
20060131171500890142 20060131171220921358 08
20050124145844968972 20050125173637609394 04
20050124145844968972 20050125173626546785 04
20050124145844968972 20050125173615531281 04
20050124145844968972 20050125173602046303 04
20050124145844968972 20050125173545109045 01
20050124145844968972 20050125174025859974 04
20050125151927031220 20050126142401562322 05
20050125105700468193 20050126142854328194 04
20050126135747890253 20050125173156718720 05
20050203142012218583 20050203141830562810 05
20050125100042859651 20050125093343203803 04
20050125173451609257 20050125094929281422 04


如果在一个时间范围(对应dealtime),查询tbl_lcinfo,
那么查出来的lcid有两种可能:
1.用[f_id] 查不到记录;
2.用[f_id] 可以查到一组对应关系记录。

现在想要的结果是,查询tbl_lcinfo,
满足1.的结果需要;
满足2.的结果,只要他查出的一组对应关系记录中dealtime最小的那一条就可以了。
...全文
327 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
minajo21 2005-03-04
  • 打赏
  • 举报
回复
问题并没解决 :(
cywarson 2005-02-24
  • 打赏
  • 举报
回复
mark.:)
minajo21 2005-02-24
  • 打赏
  • 举报
回复
:(
lishengyu 2005-02-21
  • 打赏
  • 举报
回复
up
minajo21 2005-02-21
  • 打赏
  • 举报
回复
没解决啊 :(
minajo21 2005-02-18
  • 打赏
  • 举报
回复
-- 如果20050124145844968972 不是 他们其中最小的


对应的 dealtime 最小的
minajo21 2005-02-18
  • 打赏
  • 举报
回复
我分别作了这两个查询

select *
from f_QueryFristLc('2005-01-01','2005-02-25')

select lcid,dealtime from tbl_lcinfo where dealtime between '2005-01-01'and '2005-02-25' order by lcid

结果如下:
[结果一]
LcID dealtime Lc1 Lc2
-------------------- ----------------------- -------------------- -------------------
20050120153336359959 2005-01-26 12:41:49.000 NULL NULL
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173637609394
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173626546785
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173615531281
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173602046303
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173545109045
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125174025859974
20050124150749109982 2005-01-24 15:07:49.000 NULL NULL
20050124152907140795 2005-01-24 15:29:07.000 NULL NULL
...

[结果二]
lcid dealtime
-------------------- ------------------------
20050120153336359959 2005-01-26 12:41:49.000
20050124145844968972 2005-01-24 14:58:44.000
20050124150749109982 2005-01-24 15:07:49.000
20050124152907140795 2005-01-24 15:29:07.000
...


我想要 20050124145844968972 分别与 20050125173637609394,20050125173626546785,...作比较。
如果20050124145844968972 不是 他们其中最小的,那么就把20050124145844968972 从[结果二]中滤掉,得到的最后结果是:
lcid dealtime
-------------------- ------------------------
20050120153336359959 2005-01-26 12:41:49.000
20050124150749109982 2005-01-24 15:07:49.000
20050124152907140795 2005-01-24 15:29:07.000
...
zjcxc 元老 2005-02-18
  • 打赏
  • 举报
回复
LcID是查询出的满足条件的tbl_lcinfo 表记录的LcID
dealtime是tbl_lcinfo表的
Lc1,Lc2 是对应的,从tbl_LcAssociation表查询出的满足条件的Lc1,Lc2,如果没有满足条件的,则值为null

如果没有满足条件
0003 10条记录,比如:
lc1 lc2
0003 0008
0003 0101
...
这是就要比较 0003,0008,0101的dealtime了,如果0003不是最小,则滤掉;

则不在结果中
minajo21 2005-02-18
  • 打赏
  • 举报
回复
还有,我最后的查询,需要的是 tbl_lcinfo 跟 f_id 的连表结果,

不是 tb 跟 f_id 的连表结果。
minajo21 2005-02-18
  • 打赏
  • 举报
回复
我直接运行
select *
from f_id('2005-01-01','2005-02-25')

得到的结果是:
20050120153336359959 2005-01-26 12:41:49.000 NULL NULL
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173637609394
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173626546785
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173615531281
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173602046303
20050124145844968972 2005-01-24 14:58:44.000 20050124145844968972 20050125173545109045

看不太懂这是什么意思啊

july 2005-02-18
  • 打赏
  • 举报
回复
niu,不过也听有一丝,顶
zjcxc 元老 2005-02-18
  • 打赏
  • 举报
回复
--试试

--处理函数
create function f_id(
@开始时间 datetime,
@结束时间 datetime
)
returns @re table(LcID char(20),dealtime datetime,Lc1 char(20),Lc2 char(20))
as
begin
insert @re select a.LcID,a.dealtime,b.Lc1,b.Lc2
from tbl_lcinfo a
left join tb b on a.LcID in(b.Lc1,b.Lc2)
where a.dealtime between @开始时间 and @结束时间
while @@rowcount>0
insert @re select b.LcID,b.dealtime,a.Lc1,a.Lc2
from tb a,@re b
where (b.Lc1 in(a.Lc1,a.Lc2) or b.Lc2 in(a.Lc1,a.Lc2))
and not exists(
select * from @re
where Lc1=a.Lc1 and Lc2=a.Lc2)

delete a from @re a,(
select b.LcID
from tbl_lcinfo a,(
select LcID,dealtime,Lc1 from @re
union
select LcID,dealtime,Lc2 from @re
)b where a.LcID=b.Lc1
group by b.LcID
having min(a.dealtime)<>min(b.dealtime)
)b where a.LcID=b.LcID
return
end
go

--调用函数进行查询
select a.*
from tb a,f_id('2005-01-25','2005-02-25')b
where a.Lc1=b.Lc1 and a.Lc2=b.Lc2

minajo21 2005-02-18
  • 打赏
  • 举报
回复
up
minajo21 2005-02-17
  • 打赏
  • 举报
回复
顶!
lishengyu 2005-02-17
  • 打赏
  • 举报
回复
up
minajo21 2005-02-17
  • 打赏
  • 举报
回复
查询 dealtime 从'2005-01-25'到'2005-02-25'查出来的结果有3个,
[不用按dealtime从小到大排序]
lcid dealtime ...
0001
0002
0003

再根据查询的lcid调用上次帖子中的函数进行查询,假设查询的结果是
select * from f_id('0001') --无记录
select * from f_id('0002') --1条记录
select * from f_id('0003') --10条记录

0001 无记录,保留;
0002 只有一条,保留;

0003 10条记录,比如:
lc1 lc2
0003 0008
0003 0101
...
这是就要比较 0003,0008,0101的dealtime了,如果0003不是最小,则滤掉;


这样,最后的结果是:
lcid dealtime ...
0001
0002
zjcxc 元老 2005-02-17
  • 打赏
  • 举报
回复
是这个意思吗?

查询 dealtime 从'2005-01-25'到'2005-02-25'查出来的结果有3个,按dealtime从小到大排序依次为
lcid dealtime ...
0001
0002
0003

再根据查询的lcid调用上次帖子中的函数进行查询,假设查询的结果是
select * from f_id('0001') --无记录
select * from f_id('0002') --1条记录
select * from f_id('0003') --10条记录

那最终要求的结果是:
select * from f_id('0002')
因为dealtime最小的lcid=0001无记录,所以过滤掉,而有记录的,lc0d=0002的dealtime最小
minajo21 2005-02-17
  • 打赏
  • 举报
回复
不是这个意思,我还是没说清楚


首先,我要的结果是一段时间范围内 tbl_lcinfo 表的信息。

比如 dealtime 从'2005-01-25'到'2005-02-25'查出来的结果有100个

lcid dealtime ...
0001
0002
...

在这些结果中,我要依次的用 lcid 去查 f_id
如果能查到一条或多条以上的记录(lc1,lc2的集合),而且这个 lcid 不是这组(lc1,lc2的集合)中dealtime最小的,就把他过滤掉。

这样经过过滤后的 tbl_lcinfo 结果,可能只有50条了。

就是这个意思,不知道这次说清楚了没有。
zjcxc 元老 2005-02-17
  • 打赏
  • 举报
回复
如果没有理解错的话,其实就是将原来查询中的Lcid换成根据指定时间段从tbl_lcinfo查询dealtime最小的Lcid
zjcxc 元老 2005-02-17
  • 打赏
  • 举报
回复
--处理函数
create function f_id(
@开始时间 datetime,
@结束时间 datetime
)
returns @re table(Lc1 char(20),Lc2 char(20))
as
begin
declare @LcID char(20)
select top 1 @LcID=lcid from tbl_lcinfo
where dealtime between @开始时间 and @结束时间
order by dealtime
if @@rowcount=0 return

insert @re select Lc1,Lc2 from tb
where @LcID in(Lc1,Lc2)
while @@rowcount>0
insert @re select a.Lc1,a.Lc2
from tb a,@re b
where (b.Lc1 in(a.Lc1,a.Lc2) or b.Lc2 in(a.Lc1,a.Lc2))
and not exists(
select * from @re
where Lc1=a.Lc1 and Lc2=a.Lc2)
return
end
go

--调用函数进行查询
select a.*
from tb a,f_id('2005-01-25','2005-02-25')b
where a.Lc1=b.Lc1 and a.Lc2=b.Lc2
加载更多回复(2)

34,838

社区成员

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

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