2009-10-12 47 views
0

我有兩張桌子。小部件,其中包含有關每個小部件的信息(顏色,大小等);每個小部件都有一個唯一的ID,WidgetID。
另一個表是測試,它包含有關在每個小部件上運行的多個測試的信息。因此,該表對於每個WidgetID都有多行。它包含我們可以調用的信息(WidgetID,Date,Param1,Param2等);測試信息。
我已經編寫了一個查詢,可以爲每個WidgetID查找按日期最近的兩個測試。該SQL看起來是這樣的:ms訪問複雜查詢。按日期查詢每個ID的最後兩個條目。很慢

SELECT Widgets.WidgetID,Widgets.Color,Widgets.Size,T.Date,T.Param1,T.Param2,*
自考AS T INNER JOIN小工具ON T.WidgetID = Widgets.WidgetID
WHERE(((Select COUNT(*)FROM Tests
WHERE WidgetID = T.WidgetID AND Date> T.Date))< 2);

這很有效。但是,它給了我太多的小部件。我創建了一個查詢來過濾名爲WidgetFilter的小部件。它基本上只是根據我選擇的選擇我想要的。我的想法是,我將運行相同的查詢,用「WidgetFilter」代替上述代碼中的「Widgets」。但是,當我這樣做的時候需要永遠。事實上,它只是凍結。我離開了它一個半小時,它只是坐在那裏,我不得不刪除ctl刪除。我唯一的想法是,它正在查詢每一行測試的WidgetFilter查詢(那是很多行)。我也嘗試在原始查詢中應用篩選條件。我得到相同的結果。

有沒有更好的方法來做到這一點?無論是單一的查詢,它甚至不會看起來像這樣,或者我在想的是應該有一種方法來運行WidgetFilter查詢一次,並使數據看起來像表一樣訪問(不存在這樣的事情一張臨時表)。這樣它就不會爲測試中的每個項目運行WidgetFilter。編輯:
WidgetFilter實際上是非常複雜的。我已經創建了這些用戶看到兩列的GUI選取表。左邊的選項和他/她在右邊和中間創建的列表中有一個添加按鈕和一個刪除按鈕。然後他們調用執行WidgetFilter的報告,yadda yadda yadda。無論如何,當用戶添加一個項目時,它會將該項目添加到表格中。因此,對於Widget類別Color,將會有一個名爲ColorList的表。用戶通過gui構建這個列表。有三種guis(顏色,尺寸,類型)。對於他們每個人都有一個表,然後是一個全局布爾(例如,ColorFlag),告訴哪個過濾器使用(顏色,大小或類型)。
所以,在WidgetFilter查詢時,標準顏色下框將具有這樣的:
在(選擇顏色從ColorList)
並且有一個表達式列表達式1:getColorFlag(),它是一個返回的值的模塊全局變量ColorFlag。在應用顏色表的同時也是如此。所以,當所有的說法和完成有三行標準。代碼如下所示:

選擇Widgets.WidgetID,Widgets.Color,Widgets.Size,Widgets.Type
從微
WHERE(getColorFlag()= TRUE AND(Widgets.Color)在(選擇顏色從(SelectType FROM TypeList))
OR(getSizeFlag()= True AND(Widgets.Size)In(Select Size FROM SizeList))
OR(getTypeFlag()= True AND(Widgets.Type)In(Select Type FROM TypeList))

回答

0

確定。這是我最終做的。我創建臨時表通過VBA這樣的代碼:

功能createWidgetFilterTemp()
昏暗的MySQL
昏暗deleteSQL
deleteSQL = 「DELETE * FROM TempWidgetFilter」
的MySQL = 「SELECT * INTO TempWidgetFilter FROM WidgetFilter」 DoCmd.SetWarnings假
DoCmd.RunSQL deleteSQL
DoCmd.RunSQL MySQL的
DoCmd.SetWarnings真
端功能

我加入內蒙古和TempWidgetFilter測試一個名爲WidgetCombo查詢。這讓我可以訪問所有測試信息和所有Widget信息,只有我感興趣的WidgetID。我試着用Select Count(*)語句做同樣的查詢,但是我遇到了同樣的問題,因爲Access凍結了。所以,我然後使用這樣的代碼創建的另一個臨時表通過VBA:

功能createWidgetTemp()
昏暗的MySQL
昏暗deleteSQL
deleteSQL = 「DELETE * FROM TempWidgetCombo」
的MySQL =「SELECT * INTO TempWidgetCombo從WidgetCombo」 DoCmd.SetWarnings假
DoCmd.RunSQL deleteSQL
DoCmd.RunSQL MySQL的
DoCmd.SetWarnings真
端功能

我跑這兩種功能,每當我呼籲從形式querys。這工作!事實上,它的運行速度相當快。我認爲它可以在沒有第一個臨時表的情況下工作,但將其作爲臨時表而不僅僅是查詢使得我的應用程序的另一部分運行得更快,因此我離開了它。順便說一句,我不得不運行一次刪除行註釋,以便它會創建表。我想我可能已經能夠手工創建桌子了,但這樣它就能以正確的方式獲得所有的場地。感謝您的幫助,我希望這可以幫助未來的其他人尋找臨時表幫助。

1

你可能沒有意識到的一件事。我相信,如果你有一個子選擇返回任何一行的NULL值,大多數版本的Access(不知道大概是2007)將會變成loopy land。所以,如果在任何這些表中存在會導致出現症狀的NULL Color,Size或Type。

+0

我檢查過......這是情況並非如此。沒有空值。謝謝。 – Matt

0

簡單,真的。

SELECT TOP 2 Widgets.WidgetID, Widgets.Color, Widgets.Size, T.Date, T.Param1, T.Param2,* 
FROM Tests AS T INNER JOIN Widgets ON T.WidgetID=Widgets.WidgetID 
ORDER BY T.Date DESC