2012-01-09 49 views
2

使用ASP Classic和MS Access(不問),如何臨時存儲子查詢的結果以供重用?例如,我想從我的ASP腳本運行多個查詢,如:存儲子查詢的結果以供重用

SELECT stuff FROM (subquery) WHERE ... conditions 

SELECT otherstuff FROM (subquery INNER JOIN othertable) WHERE ... different conditions 

並顯示每個的結果。子查詢在每種情況下都是相同的,運行起來相當昂貴,所以我只想運行一次。做這個的最好方式是什麼?

回答

1

我想說最好的辦法是將你的子查詢的結果插入一個臨時表中,然後根據該表選擇,直到你完成這些結果。

INSERT INTO tmp_subQuery (col1, col2, ....) SELECT col1, col2, ... FROM... 

SELECT stuff from tmp_subQuery WHERE ... conditions 
SELECT otherstuff from tmp_subQuery WHERE ... different conditions 
+0

謝謝,當我完成它時,我需要顯式刪除臨時表嗎? – Flash 2012-01-09 06:02:19

+0

我會這樣做,或將其清空(從tmp_subQuery中刪除),以便稍後再重新使用它。顯然,這不是我推薦用於併發環境的東西,但Access本身也可以這樣說。 – 2012-01-09 06:04:31

+0

訪問不支持臨時表。也許你的意思是永久/基地/劃痕表? – onedaywhen 2012-01-09 08:52:29

0

創建一個DataTable來保存子查詢的結果並使用Linq創建並處理每個查詢的結果集。

+1

OP說ASP經典。 Linq可能不是一種選擇。 – 2012-01-09 05:46:41

1

當你的意思是「商店」你的意思是身體還是邏輯?

對於物理存儲,您可以創建一個臨時表,清除它,插入子查詢結果,然後清除它;這會導致數據庫文件增加並且需要定期壓縮。另一個變化是創建一個新的數據庫,創建一個新的表等,然後刪除數據庫,沒有文件膨脹問題。

但是,你可以在邏輯上 '拯救' 的sunquery SQL作爲VIEW要查詢多次:

CREATE VIEW MyView AS <subquery here>; 

SELECT stuff FROM MyView WHERE <conditions here>; 

SELECT otherstuff FROM MyView WHERE <different conditions here>; 

UPDATE:

使用CREATE VIEW要求發動機在ANSI-92 Query Mode例如使用ADO連接對象來執行SQL。 CREATE VIEW語句的結果將是Access UI中的Query對象,因此如果您不想更改UI的ANSI查詢模式,那麼只需以常規方式創建一個Query對象;)

+0

這看起來像我後,但我不能讓'CREATE VIEW'工作在Access或通過我的ASP腳本。 – Flash 2012-01-09 23:57:26

+0

@Andrew:查看我的答案更新。 – onedaywhen 2012-01-10 07:08:15

3

也許是另一種方法會適合?您可以將過濾器應用於斷開連接的記錄集,因此也許可以將您的子查詢用作斷開連接的記錄集,並將更詳細的過濾器應用於該集。一些注意事項:

adOpenStatic = 3 
adLockBatchOptimistic = 4 
adUseClient = 3 

Set rs = Server.CreateObject("ADODB.Recordset") 
rs.CursorLocation = adUseClient 

ssql = "SELECT * From Table1 WHERE SomeField = 'Text'" 
rs.Open ssql, ocon, adOpenStatic, adLockBatchOptimistic 

''Disconnect recordset 
Set rs.ActiveConnection = Nothing 

''Filter : http://www.w3schools.com/ado/prop_rs_filter.asp 
rs.Filter = "Code LIKE 'a%'" 

Do While Not rs.EOF 
    Response.Write rs.Fields("Code") & "<br>" 
    rs.MoveNext 
Loop 

rs.Filter = "Code LIKE 'c%'" 

Do While Not rs.EOF 
    Response.Write rs.Fields("Code") & "<br>" 
    rs.MoveNext 
Loop 
+0

我需要'JOIN'子查詢與每個查詢中的其他表 - 我可以做到這一點嗎? – Flash 2012-01-09 23:56:24

+1

並非如此,但也可能有不同的看待方式。它在一定程度上取決於您查看的數據量以及整個事物是否有更多數據的未來。可以提取已經加入的集合,或更新附加到已斷開連接的集合的新字段,等等。沒有更準確的信息是不可能的。 – Fionnuala 2012-01-10 00:02:14