powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / WITH. Выбрать максимальное значение в связанной таблице
12 сообщений из 12, страница 1 из 1
WITH. Выбрать максимальное значение в связанной таблице
    #39898800
Лунтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите составить представление..
Есть представление ТОВАРЫ c двумя колонками (КатегорияИД,ТоварИД) и таблица ЦЕНЫ с историей цен (Дата, ТоварИД, Цена). Пример утрированный. В жизни в основе ТОВАРЫ - лежит очень большая таблица, которая всегда используется с очень сложными фильтрами.

Надо выбрать для товара последнюю цену и оформить представлением ПРАЙС. Основное использование - совместно с фильтром (в жизни - опять же - сложная фильтрация)

Код: sql
1.
SELECT * FROM Прайс WHERE КатегорияИд="ХХХ"



Из-за того, что создается представление на представление, есть сомнение в правильности решения. Как добиться гарантированной порционной выборки с последующим соединением с ценами? Как избежать ситуации, когда выбирается и соединяется вся таблица/представление ТОВАРЫ и только потом происходит фильтрация.

Работающими представляются два варианта. Помогите выбрать правильный...ну, или. может, есть совсем правильный?

1. Представление создаем без WITH

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE View Прайс AS 
SELECT * 
FROM Товары т
LEFT JOIN Цены ц ON ц.ТоварИД=т.ТоварИД
WHERE Not EXISTS (SELECT 1 
                              FROM Цены цц 
                              WHERE цц.ТоварИД=ц.ТоварИД AND цц.Дата>ц.Дата)



2. Представление создаем с WITH

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE View Прайс AS
WITH т
as (SELECT * FROM Товары)
LEFT JOIN Цены ц ON ц.ТоварИД=т.ТоварИД
WHERE Not EXISTS (SELECT 1 
                              FROM Цены цц 
                              WHERE цц.ТоварИД=ц.ТоварИД AND цц.Дата>ц.Дата)



Вариант с WIth рассматривается, потому что предполагается еще одно условие с использованием основной таблицы. Но понимания как работает With - нет((.
Если фильтр будет определяться потом, при использовании представления, то наложится ли фильтрация в базовом предложении SELECT * FROM Товары, или в конце, после соединения?
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39898917
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я знаю фокс не поддерживает WITH, поэтому могу предположить что запросы эти уходят на MSSQL. Если так, то форум по MSSQL тут

В каком синтаксисе написан запрос важно только для чтения его глазами, а для того чтобы понять как он реально будет выполняться - надо смотреть план выполнения запроса.
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39898931
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лунтик
Помогите составить представление..
Есть представление ТОВАРЫ c двумя колонками (КатегорияИД,ТоварИД) и таблица ЦЕНЫ с историей цен (Дата, ТоварИД, Цена). Пример утрированный. В жизни в основе ТОВАРЫ - лежит очень большая таблица, которая всегда используется с очень сложными фильтрами.

Надо выбрать для товара последнюю цену и оформить представлением ПРАЙС. Основное использование - совместно с фильтром (в жизни - опять же - сложная фильтрация)

Код: sql
1.
SELECT * FROM Прайс WHERE КатегорияИд="ХХХ"



Из-за того, что создается представление на представление, есть сомнение в правильности решения.
В MSQL представление разворачивается до таблиц в любом случае. Как добиться гарантированной порционной выборки с последующим соединением с ценами? Как избежать ситуации, когда выбирается и соединяется вся таблица/представление ТОВАРЫ и только потом происходит фильтрация. Эмпирически, смотря планы запросов и закрепляя нужное хинтами.
Работающими представляются два варианта. Помогите выбрать правильный...ну, или. может, есть совсем правильный?К сожалению, второй вариант нерабочий, в принципе, он даже не пройдет синтаксический контроль. Да и конструкция
WITH т
as (SELECT * FROM Товары)
мягко говоря, не совсем... Вариант с WIth рассматривается, потому что предполагается еще одно условие с использованием основной таблицы. Но понимания как работает With - нет((. Заметно :)Если фильтр будет определяться потом, при использовании представления, то наложится ли фильтрация в базовом предложении SELECT * FROM Товары, или в конце, после соединения?Не надо пытаться быть святее папы римского. Порядок действий определяет оптимизатор. Лучше индексы для этого запроса сделайте подходящие.
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899113
Лунтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код рабочий

Код: sql
1.
2.
3.
 CREATE VIEW БП_Товары AS 
 WITH выб AS (SELECT * FROM Товары)
  SELECT * FROM выб



Вопрос в том, что где применится условие? Как оптимизатор поймет, что надо фильтровать то, что в скобках, а не то, что уже получилось?

Код: sql
1.
SELECT * FROM БП_Товары WHERE Категория=1



Очень хочется, чтобы кто-нибудь на пальцах объяснил
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899125
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лунтик
Код рабочий
Но бессмысленный.
Код: sql
1.
2.
3.
 CREATE VIEW БП_Товары AS 
 WITH выб AS (SELECT * FROM Товары)
  SELECT * FROM выб



Вопрос в том, что где применится условие? Как оптимизатор поймет, что надо фильтровать то, что в скобках, а не то, что уже получилось?Никак. Ибо, как я уже писал, представления разворачиваются до таблиц. То есть при выборе стратегии выполнения никаких скобок уже нет. То есть представление БП_Товары бессмысленное. В результате будет выполняться
Код: sql
1.
SELECT * FROM Товары WHERE Категория=1


Спрашивается - ну на кой ляд тут представление? Или просто конструкция с with очень сильно понравилась? Ну так она немного не для этого создавалась.
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899132
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лунтик
Очень хочется, чтобы кто-нибудь на пальцах объяснил

Читай
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899360
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лунтик
Но понимания как работает With - нет((.

Statement "with" создаёт для Вас как бы временный набор данных который можно потом использовать в основном запросе как временную таблицу. Если SQL Server's оптимизатор найдёт индексы в выражении с "with" то в случае наложении Вами фильтра на итоговый запрос он может использовать их довольно эффективно.

Чтобы ответить на вопрос: "Как будет в каждом конкретном случае" Вам уже подсказали - надо смотреть профайлер.

Good luck!
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899368
Лунтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Ch, индексирована должна быть базовая таблица или представление Товары? или внутри With тоже можно создать индекс?

На всякий случай, спрошу по-другому: если базовая таблица или представление имеют нужный индекс, то правильное условие итогового запроса приведет к использованию этих индексов, да?
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899370
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая версия FOXa ?
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899389
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лунтик
Sergey Ch, индексирована должна быть базовая таблица или представление Товары? или внутри With тоже можно создать индекс?

Внутри with Вы ничего создать не можете - это "виртуальное выражение временного набора данных". Индекс должен быть создан для самой таблицы данных по которому Вы будете использовать выражение WHERE. В Вашем примере индекс должен быть создан по полю "ТоварИД".
Лунтик
На всякий случай, спрошу по-другому: если базовая таблица или представление имеют нужный индекс, то правильное условие итогового запроса приведет к использованию этих индексов, да?

Совершенно верно. Индекс будет использоваться в самих таблицах.

Но иногда MS SQL Server может посчитать что использование индекса будет неэффективно. Вот для этого мы Вам и рекомендовали посмотреть в profiler - достаточно ли эффективен Ваш запрос или View.

Good luck!
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899390
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183
А какая версия FOXa ?

Тут обсуждается использование выражения WITH в MS SQL SERVER.
...
Рейтинг: 0 / 0
WITH. Выбрать максимальное значение в связанной таблице
    #39899451
Лунтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Ch, спасибо. Теперь все понятно
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / WITH. Выбрать максимальное значение в связанной таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]