|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
Помогите составить представление.. Есть представление ТОВАРЫ c двумя колонками (КатегорияИД,ТоварИД) и таблица ЦЕНЫ с историей цен (Дата, ТоварИД, Цена). Пример утрированный. В жизни в основе ТОВАРЫ - лежит очень большая таблица, которая всегда используется с очень сложными фильтрами. Надо выбрать для товара последнюю цену и оформить представлением ПРАЙС. Основное использование - совместно с фильтром (в жизни - опять же - сложная фильтрация) Код: sql 1.
Из-за того, что создается представление на представление, есть сомнение в правильности решения. Как добиться гарантированной порционной выборки с последующим соединением с ценами? Как избежать ситуации, когда выбирается и соединяется вся таблица/представление ТОВАРЫ и только потом происходит фильтрация. Работающими представляются два варианта. Помогите выбрать правильный...ну, или. может, есть совсем правильный? 1. Представление создаем без WITH Код: sql 1. 2. 3. 4. 5. 6. 7.
2. Представление создаем с WITH Код: sql 1. 2. 3. 4. 5. 6. 7.
Вариант с WIth рассматривается, потому что предполагается еще одно условие с использованием основной таблицы. Но понимания как работает With - нет((. Если фильтр будет определяться потом, при использовании представления, то наложится ли фильтрация в базовом предложении SELECT * FROM Товары, или в конце, после соединения? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2019, 18:32 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
Насколько я знаю фокс не поддерживает WITH, поэтому могу предположить что запросы эти уходят на MSSQL. Если так, то форум по MSSQL тут В каком синтаксисе написан запрос важно только для чтения его глазами, а для того чтобы понять как он реально будет выполняться - надо смотреть план выполнения запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 07:16 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
Лунтик Помогите составить представление.. Есть представление ТОВАРЫ c двумя колонками (КатегорияИД,ТоварИД) и таблица ЦЕНЫ с историей цен (Дата, ТоварИД, Цена). Пример утрированный. В жизни в основе ТОВАРЫ - лежит очень большая таблица, которая всегда используется с очень сложными фильтрами. Надо выбрать для товара последнюю цену и оформить представлением ПРАЙС. Основное использование - совместно с фильтром (в жизни - опять же - сложная фильтрация) Код: sql 1.
Из-за того, что создается представление на представление, есть сомнение в правильности решения. Работающими представляются два варианта. Помогите выбрать правильный...ну, или. может, есть совсем правильный?К сожалению, второй вариант нерабочий, в принципе, он даже не пройдет синтаксический контроль. Да и конструкция WITH т as (SELECT * FROM Товары) мягко говоря, не совсем... Вариант с WIth рассматривается, потому что предполагается еще одно условие с использованием основной таблицы. Но понимания как работает With - нет((. Заметно :)Если фильтр будет определяться потом, при использовании представления, то наложится ли фильтрация в базовом предложении SELECT * FROM Товары, или в конце, после соединения?Не надо пытаться быть святее папы римского. Порядок действий определяет оптимизатор. Лучше индексы для этого запроса сделайте подходящие. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 09:23 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
Код рабочий Код: sql 1. 2. 3.
Вопрос в том, что где применится условие? Как оптимизатор поймет, что надо фильтровать то, что в скобках, а не то, что уже получилось? Код: sql 1.
Очень хочется, чтобы кто-нибудь на пальцах объяснил ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 14:37 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
Лунтик Код рабочий Код: sql 1. 2. 3.
Вопрос в том, что где применится условие? Как оптимизатор поймет, что надо фильтровать то, что в скобках, а не то, что уже получилось?Никак. Ибо, как я уже писал, представления разворачиваются до таблиц. То есть при выборе стратегии выполнения никаких скобок уже нет. То есть представление БП_Товары бессмысленное. В результате будет выполняться Код: sql 1.
Спрашивается - ну на кой ляд тут представление? Или просто конструкция с with очень сильно понравилась? Ну так она немного не для этого создавалась. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 14:53 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2019, 15:01 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
Лунтик Но понимания как работает With - нет((. Statement "with" создаёт для Вас как бы временный набор данных который можно потом использовать в основном запросе как временную таблицу. Если SQL Server's оптимизатор найдёт индексы в выражении с "with" то в случае наложении Вами фильтра на итоговый запрос он может использовать их довольно эффективно. Чтобы ответить на вопрос: "Как будет в каждом конкретном случае" Вам уже подсказали - надо смотреть профайлер. Good luck! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 10:30 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
Sergey Ch, индексирована должна быть базовая таблица или представление Товары? или внутри With тоже можно создать индекс? На всякий случай, спрошу по-другому: если базовая таблица или представление имеют нужный индекс, то правильное условие итогового запроса приведет к использованию этих индексов, да? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 11:45 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
А какая версия FOXa ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 11:52 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
Лунтик Sergey Ch, индексирована должна быть базовая таблица или представление Товары? или внутри With тоже можно создать индекс? Внутри with Вы ничего создать не можете - это "виртуальное выражение временного набора данных". Индекс должен быть создан для самой таблицы данных по которому Вы будете использовать выражение WHERE. В Вашем примере индекс должен быть создан по полю "ТоварИД". Лунтик На всякий случай, спрошу по-другому: если базовая таблица или представление имеют нужный индекс, то правильное условие итогового запроса приведет к использованию этих индексов, да? Совершенно верно. Индекс будет использоваться в самих таблицах. Но иногда MS SQL Server может посчитать что использование индекса будет неэффективно. Вот для этого мы Вам и рекомендовали посмотреть в profiler - достаточно ли эффективен Ваш запрос или View. Good luck! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 14:30 |
|
WITH. Выбрать максимальное значение в связанной таблице
|
|||
---|---|---|---|
#18+
982183 А какая версия FOXa ? Тут обсуждается использование выражения WITH в MS SQL SERVER. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2019, 14:31 |
|
|
start [/forum/topic.php?fid=41&fpage=5&tid=1581602]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
253ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 283ms |
total: | 647ms |
0 / 0 |