SQL查询问题 高手来看看

有两张表A,B
A表是主表,一条记录代表一票业务
B表是状态表,记录业务的状态点及发生时间,如:
ID 状态A 时间A 状态B 时间B.......
1 A 2009-06-06 B 2009-06-06.......

两个表的记录是一对一的关系
现在要查询一个业务清单,内容包括业务ID和最新发生状态名称

B表里面的状态是很多的,用游标速度很慢,数据库是SQL SERVER2000
CREATE TABLE A(
ID INT PRIMARY KEY
,FIELD1 CHAR(1)
,FIELD2 CHAR(1)
)
INSERT INTO A SELECT 1,'A','A'
UNION ALL SELECT 2,'B','B'
UNION ALL SELECT 3,'C','C'

CREATE TABLE B (
ID INT REFERENCES A(ID) UNIQUE
,DATE1 DATETIME
,DATE2 DATETIME
,DATE3 DATETIME
)
INSERT INTO B SELECT 1,'2009-03-03','2009-06-02','2009-09-03'
UNION ALL SELECT 2,'2009-01-03','2009-06-02','2009-03-03'
UNION ALL SELECT 3,'2009-04-03','2009-03-02','2009-04-03'

查询结果:
1,'2009-09-03'
2,'2009-06-02'
3,'2009-04-03'

1.如果仅有三种状态,可直接用union语句实现查询
select c.id, max(c.date0) as maxdate
from
(select id,DATE1 as date0
from B union
select id,DATE2 as date0
from B union
select id,DATE3 as date0
from B ) c
group by c.id

2.如果还有更多状态,建议你改进数据库结构为
CREATE TABLE B (
ID INT REFERENCES A(ID) UNIQUE ,
STATUS CHAR(1) ,
DATE1 DATETIME )
即仅设置一列状态列和一列时间列对应,并可以把ID和状态列(status列)设为此表的主键。这样可以直接用下面语句查出:
select id, max(date1) from b group by id

如需要进一步查询对应状态:
select table1.id, table1.status, table1.date1
from b table1, (select id, max(date1) date1 from b group by id) table2
where table1.id=table2.id and table1.date1=table2.date1

3.如果状态列比较多而不愿大幅更改数据库结构,你也可以简单地在状态表b中添加一列LastModifyDT列,用来记录每个ID的最后修改时间,查询时,就可以直接查询:
select id, lastmodifydt from b
但是需要你更改所有b表的更新语句,在每次更新状态列时,都要更新lastmodifydt列
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-05-31
select c.id as 编号,max(c.datd5) as 最大日期
from
(select id,DATE1 as datd5
from B union
select id,DATE2 as datd5
from B union
select id,DATE3 as datd5
from B ) c
group by c.id
看看是不是你要的效果
我已经测试了`跟你要的结果一样
第2个回答  2009-05-31
问题你没说清楚。
业务ID会重复吗?还有B表就2个字段。

这好像有问题

---补充
还是不能理解你的本意。如果是这样
根本就不存在最新状态时间。因为业务ID都不重复。而且
2表是1对1的关系,直接关联不就有结果了
select id,b.状态
from A a,B b
where 关联条件

--补充1
你看这样行不行
select id,case when date1 >= date2 and date1 >= date3 then date1
when date1 >= date2 and date1 < date3 then date3
when date1 < date2 and date2 >= date3 then date2
when date1 < date2 and date2 < date3 then date3 end
from B
第3个回答  2009-05-31
题目说得不大清楚。。

查询最新发生状态名称?涉及到这类应用一般用触发器 否则若实时响应,数据库资源消耗会非常大
第4个回答  2009-05-31
问题描述的不是很清晰。
B表的结构说的很模糊啊,你说的那个“ID 状态A 时间A 状态B 时间B”,这“状态A 时间A 状态B 时间B......”都是字段吗?还是你的表就三个字段:ID、状态、时间。那些什么A啊B啊的还有具体的时间都是一条一条的记录?如果都是字段的话,你要“查询一个业务清单,内容包括业务ID和最新发生状态名称”,这最新发生状态名称指什么呢?是指新生成的字段?
第5个回答  2009-06-14
这个应该可以的:
select
id,
case when date1 >= date2 and date1 >= date3 then date1
when date1 >= date2 and date1 < date3 then date3
when date1 < date2 and date2 >= date3 then date2
when date1 < date2 and date2 < date3 then date3 end riqi
from B;
----
以上,希望对你有所帮助。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网