Вложенные сквозные запросы?

У меня есть подключение ODBC к базе данных SQL Server, и, поскольку я возвращаю большие наборы записей с моими запросами, я обнаружил, что выполнять сквозные запросы быстрее, чем собственные запросы 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 как обычный запрос Access, который вызывает abc, но это снизит производительность, поскольку теперь запрос обрабатывается ACE, а не SQL Server.

Есть ли способ вложить сохраненные сквозные запросы в Access? Или создание хранимых процедур в SQL Server — единственный способ добиться этого?


person sigil    schedule 06.12.2013    source источник


Ответы (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 будет закрыто.

person Gord Thompson    schedule 06.12.2013