Хорошо ли мы знаем синтаксис команд языка запросов 1С ?
Попробуйте расставить порядок выполнения операций в запросе:
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ <..> <Имя таблицы>.<Имя поля>, СУММА( <..> ) ИЗ <Имя таблицы> КАК <Имя таблицы> ВНУТРЕННЕЕ СОЕДИНЕНИЕ <Имя таблицы> ПО <Условие> ГДЕ <Условие> СГРУППИРОВАТЬ ПО <Имя таблицы>.<Имя поля> ИМЕЮЩИЕ СУММА( <..> ) = 0 УПОРЯДОЧИТЬ ПО <Имя поля>
ВЫБРАТЬ 2 КАК Поле1, 4 КАК Поле2, 0 КАК Поле3 ПОМЕСТИТЬ ТабПример1 ОБЪЕДИНИТЬ ВЫБРАТЬ 3/2, 3, 0 ;
Поле1 | Поле2 | Поле3 |
2 | 4 | 0 |
3/2 | 3 | 0 |
ВЫБРАТЬ 1 КАК Поле1, 3 КАК Поле2, 0 КАК Поле3 ПОМЕСТИТЬ ТабПример2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, 3, 0 ;
Поле1 | Поле2 | Поле3 |
1 | 3 | 0 |
1 | 3 | 0 |
Соединение таблиц VS. Проверка условия ГДЕ
Комментарий. Сначала выполняется Соединение таблиц. Об этом написано в учебниках SQL. Поэтому перед соединением необходимо тщательно подготовить таблицы: убрать «ненужные» записи, подключить индексы. Контрпример на сравнение очередности "Соединение таблиц" - "Проверка условия ГДЕ" пока не придумал.
Проверка условия ГДЕ VS. Расчет агрегатных функций без группировки
ВЫБРАТЬ МАКСИМУМ(ТабПример1.Поле1) КАК Поле1, МАКСИМУМ(ТабПример1.Поле2) КАК Поле2 ИЗ ТабПример1 КАК ТабПример1 ГДЕ ТабПример1.Поле2 = 3
Результат: Поле1 = 1.5, Поле2 = 3.
Комментарий. Сначала выполняется Проверка "ГДЕ". Иначе был бы пустой результат.
Расчет агрегатных функций без группировки VS. Опции ПЕРВЫЕ <ХХ>– Упорядочить По.
ВЫБРАТЬ ПЕРВЫЕ 1 СУММА(ТабПример1.Поле1) КАК Поле1, СУММА(ТабПример1.Поле2) КАК Поле2 ИЗ ТабПример1 КАК ТабПример1 УПОРЯДОЧИТЬ ПО Поле1
Результат: Поле1 = 3.5, Поле2 = 7.
Комментарий. Сначала выполняется расчет агрегатных функций без группировки, затем команды ПЕРВЫЕ <ХХ>– Упорядочить По.
Группировка с расчетом агрегатных функций VS. опции ПЕРВЫЕ <ХХ>– Упорядочить По
ВЫБРАТЬ ПЕРВЫЕ 1 СУММА(ТабПример1.Поле1) КАК Поле1, СУММА(ТабПример1.Поле2) КАК Поле2, ТабПример1.Поле3 ИЗ ТабПример1 КАК ТабПример1 СГРУППИРОВАТЬ ПО ТабПример1.Поле3 УПОРЯДОЧИТЬ ПО Поле2
Результат: Поле1 = 3.5, Поле2 = 7, Поле3 = 0.
Комментарий. Сначала выполняется группировка с расчетом агрегатных функции, затем команды ПЕРВЫЕ <ХХ>– Упорядочить По. Сразу после расчета агрегатных функций проверяется условие «Имеющие». Контрпример на сравнение очередности "Имеющие"-"Различные" пока не придумал.
Группировка с расчетом агрегатных функций VS. опция Различные
ВЫБРАТЬ РАЗЛИЧНЫЕ ТабПример2.Поле3, СУММА(ТабПример2.Поле1) КАК Поле1, СУММА(ТабПример2.Поле2) КАК Поле2 ИЗ ТабПример2 КАК ТабПример2 СГРУППИРОВАТЬ ПО ТабПример2.Поле3
Результат: Поле1 = 2, Поле2 = 6.
Комментарий. Сначала выполняется Группировка с расчетом агрегатных функций. Конечно, применение в одном запросе этих операций бессмысленно.
опция Различные VS. опции ПЕРВЫЕ <ХХ>– Упорядочить По
ВЫБРАТЬ ТабПример2.Поле1, ТабПример2.Поле2, ТабПример2.Поле3 ПОМЕСТИТЬ ТабПример3 ИЗ ТабПример2 КАК ТабПример2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ТабПример1.Поле1, ТабПример1.Поле2, ТабПример1.Поле3 ИЗ ТабПример1 КАК ТабПример1 ; ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 3 ТабПример3.Поле1, ТабПример3.Поле2, ТабПример3.Поле3 ИЗ ТабПример3 КАК ТабПример3 УПОРЯДОЧИТЬ ПО Поле1
Комментарий. Сначала выполняется Опция "Различные", затем опции Первые <ХХ> -Упорядочить По. Если был бы другой порядок выполнения, то в результате получилось бы не три строки, а две.
Смотрите следующий запрос:
ВЫБРАТЬ ПЕРВЫЕ 3 ТабПример3.Поле1, ТабПример3.Поле2, ТабПример3.Поле3 ИЗ ТабПример3 КАК ТабПример3 УПОРЯДОЧИТЬ ПО ТабПример3.Поле1
Упорядочить По VS. ПЕРВЫЕ <ХХ>
ВЫБРАТЬ ПЕРВЫЕ 1 ТабПример1.Поле1 КАК Поле1, ТабПример1.Поле2 КАК Поле2 ИЗ ТабПример1 КАК ТабПример1 УПОРЯДОЧИТЬ ПО Поле1
Результат: Поле1 = 1,5, Поле2 = 3.
Комментарий. Сначала выполняется Упорядочить По. Смотрите следующий запрос.
ВЫБРАТЬ ПЕРВЫЕ 1 ТабПример1.Поле1 КАК Поле1, ТабПример1.Поле2 КАК Поле2 ИЗ ТабПример1 КАК ТабПример1
Результат: Поле1 = 2, Поле2 = 4.
Вывод: операции SQL выполняются в последовательности
- Соединение
- Проверка условия "ГДЕ"
- Группировка с расчетом агрегатных функций
- Проверка условия «Имеющие»
- Опция Различные
- Опция Упорядочить по
- Опция Первые <ХХ>
Послесловие
Пока я писал статью, узнал, что упорядочивание может происходить по агрегатным функциям, что вычисление агрегатных функций без группировки существенно отличается от группировки с вычислением агрегатных функций. Спасибо всем, кто проявил интерес к теме, давал конструктивные комментарии. Мне подсказали, что аналогичная информация по SQL содержится
https://msdn.microsoft.com/ru-ru/library/ms189499%28v=sql.120%29.aspx
https://msdn.microsoft.com/en-us/library/ms189499.aspx
Порядок для SQL в общем, совпадает с 1С, хотя слова другие :-))
- FROM
-
ON
-
JOIN
-
WHERE
-
GROUP BY
-
WITH CUBE или WITH ROLLUP
-
HAVING
-
SELECT
-
DISTINCT
-
ORDER BY
-
TOP