使用ASP Classic和MS Access(不要问),如何暂时存储子查询的结果以便重复使用?例如,我想从我的ASP脚本运行多个查询,如:
SELECT stuff FROM (subquery) WHERE ... conditions
SELECT otherstuff FROM (subquery INNER JOIN othertable) WHERE ... different conditions
显示每个的结果。子查询在每种情况下都是相同的,并且运行起来非常昂贵所以我想只运行一次。这样做的最佳方式是什么?
答案 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为每个查询创建和处理结果集。