存储子查询的结果以供重用

时间:2012-01-09 04:00:35

标签: sql ms-access asp-classic

使用ASP Classic和MS Access(不要问),如何暂时存储子查询的结果以便重复使用?例如,我想从我的ASP脚本运行多个查询,如:

SELECT stuff FROM (subquery) WHERE ... conditions

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

显示每个的结果。子查询在每种情况下都是相同的,并且运行起来非常昂贵所以我想只运行一次。这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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>;

更新:

使用CREATE VIEW要求引擎位于ANSI-92 Query Mode,例如使用ADO Connection对象来执行SQL。 CREATE VIEW语句的结果将是Access UI中的Query对象,因此如果您不想更改UI的ANSI查询模式,则只需以通常的方式创建Query对象;)

答案 3 :(得分:0)

创建一个DataTable来保存子查询的结果,并使用Linq为每个查询创建和处理结果集。