不好意思!如何有效地執行數據庫初始查詢?
我們有兩個數據庫表,例如汽車和車輪。他們相關的一個車輪屬於一輛車,一輛車有多個車輪。但是,車輪可以在不影響汽車「版本」的情況下進行更改。在不影響車輪版本的情況下(即沒有級聯更新),汽車的記錄可以被更新(例如繪畫作業)。
例如,汽車表目前看起來是這樣的:
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