有两张表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'
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列
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
看看是不是你要的效果
我已经测试了`跟你要的结果一样
业务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
查询最新发生状态名称?涉及到这类应用一般用触发器 否则若实时响应,数据库资源消耗会非常大
B表的结构说的很模糊啊,你说的那个“ID 状态A 时间A 状态B 时间B”,这“状态A 时间A 状态B 时间B......”都是字段吗?还是你的表就三个字段:ID、状态、时间。那些什么A啊B啊的还有具体的时间都是一条一条的记录?如果都是字段的话,你要“查询一个业务清单,内容包括业务ID和最新发生状态名称”,这最新发生状态名称指什么呢?是指新生成的字段?
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;
----
以上,希望对你有所帮助。