嵌套传递查询?

Posted

技术标签:

【中文标题】嵌套传递查询?【英文标题】:Nested pass-through queries? 【发布时间】:2013-12-06 01:30:27 【问题描述】:

我有一个到 SQL Server 数据库的 ODBC 连接,并且由于我的查询返回了大型记录集,我发现运行传递查询比本机 Access 查询更快。

但我发现编写和组织查询很困难,因为据我所知,我无法保存几个不同的传递查询并将它们加入另一个传递查询。我对该数据库具有只读访问权限,因此无法在 SQL Server 中保存存储过程,然后在传递中引用它们。

例如,假设我只想从以下查询中获取最大值为 o_version 的条目:

select d.o_filename,d.o_version,parent.o_projectname
from dms_doc d
left join
dms_proj p
on
d.o_projectno=p.o_projectno
left join
dms_proj parent
on
p.o_parentno=parent.o_projectno
where
p.o_projectname='ABC'
and
lower(left(right(d.o_filename,4),3))='xls'
and
charindex('xyz',lower(d.o_filename))=0

我只想获取最大值为d.o_version 的条目。通常我会将其保存为一个名为例如abc 的查询,然后编写另一个查询abcMax

select * from abc
inner join
(select o_filename,o_projectname,max(o_version) as maxVersion from abc
 group by o_filename,o_projectname) abc2
on
abc.o_filename=abc2.o_filename
and
abc.o_projectname=abc2.o_projectname
where
abc.o_version=abc2.maxVersion

但是,如果我不能将abc 存储为可以在传递查询abcMax 中使用的查询,那么我不仅必须将abc 的整个正文复制到abcMax 几个次,但是如果我对abc 的内容进行任何更改,那么我需要对嵌入在abcMax 中的每个副本进行更改。

替代方法是将abcMax 编写为调用abc 的常规Access 查询,但这会降低性能,因为查询现在由ACE 而不是SQL Server 处理。

有没有办法在 Access 中嵌套存储的传递查询?还是在 SQL Server 中创建存储过程是实现此目的的唯一方法?

【问题讨论】:

【参考方案1】:

如果您有(或可以获得)在 SQL Server 上创建临时表的权限,那么您也许可以利用它们来获得一些优势。例如,您可以运行一个传递查询来使用第一个查询的结果创建一个临时表(在此示例中非常简化):

CREATE TABLE #abc (o_filename NVARCHAR(50), o_version INT, o_projectname NVARCHAR(50));
INSERT INTO #abc SELECT o_filename, o_version, o_projectname FROM dms_doc;

然后您的第二个直通查询可以只引用临时表

select * from #abc
inner join
(select o_filename,o_projectname,max(o_version) as maxVersion from #abc
 group by o_filename,o_projectname) abc2
on
#abc.o_filename=abc2.o_filename
and
#abc.o_projectname=abc2.o_projectname
where
#abc.o_version=abc2.maxVersion

完成后,您可以运行传递查询以显式删除临时表

DROP TABLE #abc

否则,当您与 SQL Server 的连接关闭时,SQL Server 会自动为您删除它。

【讨论】:

【参考方案2】:

对于仍然需要此信息的任何人:

直通查询允许使用可用于 Oracle SQL 的 cte 查询。类似于创建多个选择查询,但更快更高效,没有“堆叠”选择查询的混乱和混乱,因为您可以在一个视图中查看所有底层查询。

例子:

With Prep AS (

SELECT A.name,A.city

FROM Customers AS A
)

SELECT P.city, COUNT(P.name) AS clients_per_city
FROM Prep AS P
GROUP BY P.city

【讨论】:

以上是关于嵌套传递查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套列表的列表传递到 JPA 本机查询中

Mybatis resultMap 嵌套集合

为啥我的 graphql 嵌套查询返回 null?

将两个值传递给嵌套的 restful 控制器

SQL嵌套子查询和相关子查询的执行过程有啥区别

SQL嵌套子查询和相关子查询的执行过程有啥区别