Я хотел бы сделать однократное путешествие в базу данных MSSQL для извлечения нескольких таблиц. Каждая таблица так или иначе полагается на один и тот же несколько дорогой поиск, который будет захватывать кучу идентификаторов и обрабатывать разбиение на страницы и очень базовую фильтрацию. Поэтому я пытаюсь переместить дорогостоящую часть, так что это происходит только один раз и повторно использовать ее результирующий набор несколько раз после этого.Использование результатов запроса WITH в нескольких подзапросах
Ниже приведена действительно урезанная версия того, что я пытаюсь сделать. «Основной запрос» - это дорогостоящий поиск, который является общим для следующих других запросов под ним. «Первый набор результатов» должен возвращать то, что я хочу, как и следовало ожидать, но «второй набор результатов» терпит неудачу, потому что основной запрос выходит за рамки.
-- Primary query
WITH t(ItemId, Row) AS (
SELECT ItemId, ROW_NUMBER() OVER(ORDER BY DateCreated DESC) AS Row
FROM Items
)
-- First result set
SELECT *
FROM Items
INNER JOIN t ON Items.ItemId = t.ItemId
WHERE t.Row < 10
-- Second result set
SELECT *
FROM Photos
INNER JOIN ItemPhotos ON Photos.PhotoId = ItemPhotos.PhotoId
INNER JOIN t ON ItemPhotos.ItemId = t.ItemId
WHERE t.Row < 10
Есть ли способ сделать это, чтобы работать второй результирующий набор?
Я хотел бы избежать создания временных таблиц, потому что, по моему опыту, почти всегда есть более дешевая альтернатива, которую я еще не изучил. В этом случае я не уверен, что есть альтернатива, но я надеюсь, что кто-то знает об этом. (Я проверю, конечно.)
Я знаю, что в приведенном выше примере вы можете, вероятно, вернуть единый результирующий набор, выполнив INNER JOIN
на все это, но в моем случае это не приемлемое решение в качестве результата набор будет массивным.
Зачем нужен массив результатов? Для меня это выглядит так, как будто вы можете просто возглавить 10 пунктов ItemId, упорядоченных по DateCreated, и присоединиться к этому. С индексом по DateCreated и id соединения, который не может быть проблематичным, или я что-то упускаю? – Anton
Даже если синтаксис действительно сработал, это не устранит круглые поездки в базу данных. CTE - это просто синтаксис. – Paparazzi
@ Антон Из того, что я понял, это просто упрощенный пример. – SQB