SQL查询问题 高手来看看

来源:百度知道 编辑:UC知道 时间:2024/05/18 07:56:20
有两张表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

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列

select c.id as 编号,max(c.datd5) as 最大日期
from
(select id,DATE1 as datd5