Извините за длинный вопрос!
У нас есть две таблицы базы данных, например, Автомобиль и Колесо. Они связаны с тем, что колесо принадлежит автомобилю, а автомобиль имеет несколько колес. Колеса, однако, можно менять, не влияя на «версию» автомобиля. Запись автомобиля может быть обновлена (например, покраска), не влияя на версию колес (то есть без каскадного обновления).
Например, автомобильный стол в настоящее время выглядит так:
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), но он не улучшил наш запрос.
Пример запроса: Показать идентификатор автомобиля 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 и вставьте запись 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