首页 文章

嵌套的传递查询?

提问于
浏览
0

我有一个到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 回答

  • 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的连接关闭时自动删除它 .

相关问题