求有点小逻辑的SQL

伙柴人 2010-03-25 04:27:49
表a

tid 项目名 状态
1 001 3放行
2 002 3放行
3 003 2测试
4 004 1开始
5 005 1开始
...

表B

id tid 时间 状态
1 1 2009-1-3 1开始
2 1 2009-1-5 2测试
3 1 2009-1-6 3放行
4 1 2009-1-8 close
5 1 2009-1-9 3放行

6 2 2009-2-3 1开始
7 2 2009-2-4 close
8 2 2009-2-5 1开始
9 2 2009-2-6 2测试

10 3 2009-2-8 1开始
11 3 2009-2-9 2测试

12 4 2009-2-10 1开始
13 4 2009-2-11 2测试
14 4 2009-2-11 close
15 4 2009-2-12 3放行

16 5 2009-2-13 1开始
17 5 2009-2-14 close
...

我现在要排除 状态里面最后一条记录为close但没有“3放行”的数据 得到如下表:
表C
tid 项目名 时间 状态
1 001 2009-1-6 3放行
2 002 2009-2-6 2测试
3 003 2009-2-9 2测试
4 004 2009-2-7 3放行

我现在的办法就是用几个not in来一个个条件排除 这样性能及不好,但又想不出其他办法 大家帮帮忙啊!

注:数据库结构不能更变 是SQL2005 其中时间字段是varchar类型
...全文
73 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
伙柴人 2010-03-25
  • 打赏
  • 举报
回复
SQL太长了 实际的表要比这个复杂多了 贴出来更难理解

现在只是想要个逻辑

表B中的TID和表A中的TID是关联字段,表B中所对应每一条TID都是一组数据 现在要取的是 表A的ID 项目名
表B的时间和状态 现在的条件是 表B中每个TID所对应的那组数据中最后日期状态为Close但是又没有“3放行”的数据就不插入到表C中
这个“3放行”随便在这个close之前之后都不排除 如果一组数中有close 且没有"3放行" 例如TID为2和5 这里5要被排除因为5的最后更新时间的记录是close 而2就不用排除 因为2最后更新时间的记录是“2测试”
Thr21ough 2010-03-25
  • 打赏
  • 举报
回复
看不懂~~~~~~~~~~~
yuanhuiqiao 2010-03-25
  • 打赏
  • 举报
回复
不是很明确你的意思,贴出你的SQL看看

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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