我有一个我正在开发的大型Access数据库,由其他人设计。我正在努力改进它。它的设置方式,首先运行查询1,然后运行表A.然后,运行查询2,其中使用表A,然后运行表B.然后运行查询3,它使用表B并生成表C.然后运行查询4,它使用表C并生成表D.我们使用的最终输出是表D.
我的改进是将查询1,查询2和查询3更改为选择查询,而不是生成表查询,只需通过查找和替换来更改SQL(例如,在查询2中,替换所有实例表A用查询1代替)。查询4仍然是一个make table查询,它使表D我稍后导出到Excel。
我的问题:我可以运行查询4吗?也就是说,会自动运行查询3,它将自动运行查询2,它将自动运行查询1吗?或者,我是否需要先运行查询1,然后运行查询2,然后运行查询3,然后运行查询4?
也许除此之外,我还可以将查询4作为选择查询吗?然后,我甚至不会运行查询4.相反,我只是将查询4本身导出到Excel,我想知道是否会自动运行查询4,这将运行查询3,依此类推。
请注意:我不是在寻找任何SQL技巧。我想暂时使用Access(这是SQL的前端,我知道)。
注意:我意识到这里的一个答案是,“你为什么不试试呢?”我有,它似乎工作,因为我认为它应该。问题是,我之前已经多次运行过所有查询,所以我不知道这是否会使一切现在正常工作但如果我还没有运行以前的查询,它可能会在以后工作方式不同。
感谢您的帮助
答案 0 :(得分:1)
简短的回答是,“是的,您可以嵌套SELECT查询,只需导出最外层的查询结果即可导出到Excel。”
在许多情况下,查询可以像表一样使用。嵌套查询将执行自己的SELECT语句,并将其结果传递给周围的查询,就像它是一个表一样。
如果query2调用query1和
query3调用query2和
qyery4调用query3
...然后,当您执行query4时,通过将结果传递给下一个查询,查询将按照下面显示的顺序自动执行:
表格 - > query1 - > query2 - > query3 - > query4
我认为您的查询看起来像这样:
query1: SELECT * FROM table;
query2: SELECT * FROM query1;
query3: SELECT * FROM query2;
query4: SELECT * FROM query3;
答案 1 :(得分:1)
正如Olivier已经提到的那样,从SELECT查询中选择是按预期工作的。您可以通过在模块中创建此函数来实际测试它
Function LogQueryCall(ByVal query As String)
Debug.Print query & " " & Now
End Function
然后从您的查询中调用它,例如
Query1
SELECT *, LogQueryCall("Query1") FROM Table1 ;
QUERY2
SELECT *, LogQueryCall("Query2")
FROM Query1
INNER JOIN Table2
ON Query1.Field = table2.Field
QUERY3
SELECT *, LogQueryCall("Query3") FROM Query2
然后你会在立即窗口中看到结果
Query1 01/03/2012 5:54:46 PM
Query2 01/03/2012 5:54:46 PM
Query3 01/03/2012 5:54:46 PM
注意,每个查询只会调用一次函数,而不是每行调用一次
另一种选择是创建一个大查询。这将使用from子句中的每个查询的内容,如此。
SELECT *
FROM
(Select * FROM Table1) A
INNER JOIN Table2
ON a.Field = table2.Field