2012-01-09 27 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