view с параметром

eddie
Дата: 22.06.2004 21:40:34
никак не могу понять, как правильно реализовать одну вещь

проблема возникает достаточно часто, поэтому приведу абстактный пример:
предположим есть таблица остатков на складе (store) следущего вида:
version integer - версия (ну скажем дата)
name varchar(10) - название
value integer - значение

необходимо получить разницу между двумя версиями (что изменилось):
select name, old.value, new.value from store as old outer join store as new using (name) where old.version=.... and new.version=.... and old.cnt<>new.cnt

и результат использовать в других запросах. повторюсь - пример абстрактный, потребность в чем-то подобном возникает часто. другой пример - собрать статистику по какому-то фильтру (период данных, клиент и т.д.). то есть входные данные ограничиваются с помощью каких-либо параметров, получаем большой набор данных и строим сложный запрос на их основе

я вижу 3 способа реализации:
- создавать view. способ наиболее симпатичный, но параметры в view заданы жестко, придется динамически пересоздавать view для нужных параметров (могут возникнуть проблемы с параллельной работой нескольких клиентов и вообще некрасиво)
- делать prepare и execute. способ неплохой, но prepare придется делать заново в каждой сессии, нельзя будет использовать результаты в другом view
- написать sql-функцию. этот вариант не нравится тем, что плохо дружит с оптимизатором (если мы используем результат этой функции в запросе, то оптимизатор не объединяет их в один как в случае с view); кроме того у меня есть подозрение, что функции не рассчитаны на большие объемы и будут тормозить в случае больших наборов результирующих данных

такое впечатление, что я делаю что-то не то и не так, что называется изобретаю велосипед с квадратными колесами