2013-10-04 45 views
1

我使用ADODB从SQL Server中选择我的VBA代码中的数据,并且想加入几个查询。在Excel VBA中存储SQL Server查询以便加入

比方说,我有两个疑问:

query1 = _ 
"select tblA.x,tblB.y from tblA inner join tblB on tblA.x=tblB.x" 

query2 = _ 
"select tblA.x,tblA.abc from tblA inner join " & _ 
"(select max(tblA.x) as maxX from tblA group by x) qryA on tblA.x=qryA.maxX" 

,我与运行查询:

Public sub getRecordsets(objConn as ADODB.Connection,rs1 as ADODB.Recordset,rs2 as ADODB.Recordset) 

rs1.Open query1, objConn 
rs2.Open query2, objConn 

End Sub 

我想在第三个记录加入这两个查询。我知道我可以编写一个连接两个查询的长SQL语句,但我想将它们分开,以使代码更易于维护。

如果我使用的MS Access,我会创建两个存储查询query1query2,然后从中选择如下:

select y,abc from query1 inner join query2 on query1.x=query2.x 

有没有办法,我可以加入记录集的方法吗?我没有写入权限来在SQL Server数据库中创建UDF或视图;如果我能够获得写权限,那我该怎么做?

+0

你有没有考虑使用'UNION ALL'和单个查询?为什么你想要一个记录集而不是两个单独的记录集? –

+0

@TimWilliams,我不想从每个查询中得到行的联合,我想通过它们的公共密钥加入它们:'query1.x = query2.x',这样我就可以看到哪个'y'值匹配哪个' abc'值。 – sigil

回答

0

如果我是你,我会在SQL Server上做所有的查询,特别是那些带JOINS的查询,因为SQL Server可以更快和更有效地处理连接。通过这种方式,您只会将实际需要的记录带到前方,而不是将所有记录带入并在Access上对其进行过滤。

+0

通过执行“在SQL Server上”的查询意味着什么?写一个大的SQL语句并将其传递给'recordset.open()'?我试图找到一种方法将其组织为一组可以加入的子查询,以便更改或重用这些查询组件。 – sigil

0

您无法加入记录集,因为这已经是客户端的数据结构。这就是穆罕默德阿里试图说的,你应该在服务器上执行完整的查询。 (因为在链中处理记录集太迟了)

虽然您最终会合并SQL语句,这是一种解析器/语法,但您希望使用它的方式却是另一回事。东西和恕我直言更多的学术。其实 - 我们会看看这个入口是否能够存活足够长的时间 - 我已经看到了很多来自你方的问题,这些问题很有趣,很聪明,但也有些不同寻常。这迫使我评论,所以你可能会ping我。

在一般情况下,我会说netoffice可以使你的生活变得更加简单...