抱歉问题有点长!
我们有两个数据库表,例如Car和Wheel。它们之间存在关联,即车轮属于汽车,汽车有多个车轮。但是,可以更换车轮而不影响汽车的“版本”。可以更新汽车记录(例如喷漆),而不会影响车轮的版本(即没有级联更新)。
例如,Car表目前如下:
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),但并没有真正改善我们的查询。
示例查询:显示Car 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)
如果您想尝试此操作,则可以使用以下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