часто я сталкиваюсь с такой ситуацией, когда мне нужно присоединить большую таблицу к определенному преобразованию таблицы.
Я сделал пример с большой таблицей и меньшей таблицей цен.
Войдите в таблицу CarPrices, в которой указаны цены на марку / модель автомобиля с датами начала и окончания. Я хочу объединить все проданные автомобили с продажной ценой в таблице CarPrices по критерию SaleDate BETWEEN PriceStartingDate и PriceEndingDate, но если за период нет цены, я хочу присоединиться к новейшей найденной цене.
Я могу сделать это вот так, но это ужасно медленно:
WITH CarPricesTransformation AS (
SELECT CarBrand, CarModel, PriceStartingDate,
CASE WHEN row_number() OVER (PARTITION BY CarBrand, CarModel,
ORDER BY PriceStartingDate DESC) = 1
THEN NULL ELSE PriceEndingDate END PriceEndingDate,
Price
FROM CarPrices
)
SELECT SUM(Price)
FROM LargeCarDataBase C
INNER JOIN CarPricesTransformation P
ON C.CarBrand = P.CarBrand
AND C.CarModel = P.CarModel
AND C.SaleDate >= P.PriceStartingDate
AND (C.SaleDate <= P.PriceEndingDate OR P.PriceEndingDate IS NULL)
Надежный способ сделать это быстрее - забыть о создании VIEW и вместо этого создать хранимую процедуру, где я сначала подготавливаю меньшую таблицу цен как временную таблицу с правильным кластеризованным индексом, а затем выполняю присоединение к ней. Это намного быстрее. Но я хотел бы придерживаться точки зрения.
Есть предположения...?
#temp
таблицы, хотя ссылка в ответе дает пример того, как это сделать с помощью руководства по плану. - person Martin Smith   schedule 18.02.2011CREATE VIEW foo AS <op's code goes here>
- person Martin Smith   schedule 18.02.2011