不好意思!如何有效地执行数据库初始查询?
我们有两个数据库表,例如汽车和车轮。他们相关的一个车轮属于一辆车,一辆车有多个车轮。但是,车轮可以在不影响汽车“版本”的情况下进行更改。在不影响车轮版本的情况下(即没有级联更新),汽车的记录可以被更新(例如绘画作业)。
例如,汽车表目前看起来是这样的:
CarId, CarVer, VersionTime, Colour
1 1 9:00 Red
1 2 9:30 Blue
1 3 9:45 Yellow
1 4 10:00 Black
车轮表看起来像这样(这款车只有两个轮子!)
WheelId, WheelVer, VersionTime, CarId
1 1 9:00 1
1 2 9:40 1
1 3 10:05 1
2 1 9:00 1
所以,还有的是4个版本的这两辆轮车。它的第一个轮子(WheelId 1)没有改变。第二轮在10:05更换(例如涂漆)。
如何有效地完成作为可以加入到其他表的查询要求?请注意,这是一个新的数据库,我们拥有该模式,并可以更改它或添加审计表以简化查询。我们尝试了一种审计表方法(列:CarId,CarVersion,WheelId,WheelVersion,CarVerTime,WheelVerTime),但它并没有真正改善我们的查询。
实施例的查询:显示汽车ID 1,因为它是,包括它的车轮记录为9:50。该查询应该导致返回这两行:
WheelId, WheelVer, WheelVerTime, CarId, CarVer, CarVerTime, CarColour
1 2 9:40 1 3 9:45 Yellow
2 1 9:00 1 3 9:45 Yellow
我们可以拿出最好的查询是这样的:
select c.CarId, c.VersionTime, w.WheelId,w.WheelVer,w.VersionTime,w.CarId
from Cars c,
( select w.WheelId,w.WheelVer,w.VersionTime,w.CarId
from Wheels w
where w.VersionTime <= "12 Jun 2009 09:50"
group by w.WheelId,w.CarId
having w.WheelVer = max(w.WheelVer)
) w
where c.CarId = w.CarId
and c.CarId = 1
and c.VersionTime <= "12 Jun 2009 09:50"
group by c.CarId, w.WheelId,w.WheelVer,w.VersionTime,w.CarId
having c.CarVer = max(c.CarVer)
而且,如果你想尝试这则create table和insert记录SQL在这里:
create table Wheels
(
WheelId int not null,
WheelVer int not null,
VersionTime datetime not null,
CarId int not null,
PRIMARY KEY (WheelId,WheelVer)
)
go
insert into Wheels values (1,1,'12 Jun 2009 09:00', 1)
go
insert into Wheels values (1,2,'12 Jun 2009 09:40', 1)
go
insert into Wheels values (1,3,'12 Jun 2009 10:05', 1)
go
insert into Wheels values (2,1,'12 Jun 2009 09:00', 1)
go
create table Cars
(
CarId int not null,
CarVer int not null,
VersionTime datetime not null,
colour varchar(50) not null,
PRIMARY KEY (CarId,CarVer)
)
go
insert into Cars values (1,1,'12 Jun 2009 09:00', 'Red')
go
insert into Cars values (1,2,'12 Jun 2009 09:30', 'Blue')
go
insert into Cars values (1,3,'12 Jun 2009 09:45', 'Yellow')
go
insert into Cars values (1,4,'12 Jun 2009 10:00', 'Black')
go
您的查询效率更高(表扫描更少),但不执行as-of查询。您的查询只获取最新版本,而不是09:50的版本。我们可能能够从您的查询中获得一些想法,所以谢谢。 – ng5000 2009-06-12 12:34:33
我们将无法使用视图,因为我们需要将查询的时间组件传递到查询中。 SP可能是一个选项,但如果不得不加入其他表格,我们可能需要查看表格功能 – ng5000 2009-06-12 12:39:15