1с Запрос оптимизация

1. applesound 1 22.01.20 17:04 Сейчас в теме
Добрый день.
Сделал рабочий, но не оптимизированный запрос.
Вопрос: как можно оптимизировать?
Есть 2 таблицы
Таб1 Таб2
Н1 10 Н1 9
Н2 5 Н2 5
Н3 3
Результат:
Н1 1
Н3 -3
Запрос

ВЫБРАТЬ
"Н1" КАК Номенклатура,
10 КАК Количество
ПОМЕСТИТЬ Таблица1Исходная

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Н2",
5
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
"Н1" КАК Номенклатура,
9 КАК Количество
ПОМЕСТИТЬ Таблица2Исходная

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Н2",
5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
"Н3",
3
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Таблица1.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА Таблица1.Количество >= 0
ТОГДА 0
КОНЕЦ КАК Количество
ПОМЕСТИТЬ Таблица3ПолучилВсюНоменклатуруСПовторяющимися
ИЗ
Таблица1Исходная КАК Таблица1
ПОЛНОЕ СОЕДИНЕНИЕ Таблица2Исходная КАК Таблица2
ПО (ИСТИНА)

СГРУППИРОВАТЬ ПО
Таблица1.Номенклатура,
ВЫБОР
КОГДА Таблица1.Количество >= 0
ТОГДА 0
КОНЕЦ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
Таблица2.Номенклатура,
ВЫБОР
КОГДА Таблица2.Количество >= 0
ТОГДА 0
КОНЕЦ
ИЗ
Таблица1Исходная КАК Таблица1
ПОЛНОЕ СОЕДИНЕНИЕ Таблица2Исходная КАК Таблица2
ПО (ИСТИНА)

СГРУППИРОВАТЬ ПО
Таблица2.Номенклатура,
ВЫБОР
КОГДА Таблица2.Количество >= 0
ТОГДА 0
КОНЕЦ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
Таблица3ПолучилВсюНоменклатуруСПовторяющимися.Номенклатура КАК Номенклатура,
Таблица3ПолучилВсюНоменклатуруСПовторяющимися.Количество КАК Количество
ПОМЕСТИТЬ Таблица4УбралПовторяющиеся
ИЗ
Таблица3ПолучилВсюНоменклатуруСПовторяющимися КАК Таблица3ПолучилВсюНоменклатуруСПовторяющимися
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Таблица4УбралПовторяющиеся.Номенклатура КАК Номенклатура,
Таблица1Исходная.Количество КАК Количество
ПОМЕСТИТЬ Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2
ИЗ
Таблица4УбралПовторяющиеся КАК Таблица4УбралПовторяющиеся
ЛЕВОЕ СОЕДИНЕНИЕ Таблица1Исходная КАК Таблица1Исходная
ПО Таблица4УбралПовторяющиеся.Номенклатура = Таблица1Исходная.Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Таблица4УбралПовторяющиеся.Номенклатура КАК Номенклатура,
Таблица4УбралПовторяющиеся.Количество + Таблица2Исходная.Количество КАК Количество
ПОМЕСТИТЬ Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1
ИЗ
Таблица4УбралПовторяющиеся КАК Таблица4УбралПовторяющиеся
ЛЕВОЕ СОЕДИНЕНИЕ Таблица2Исходная КАК Таблица2Исходная
ПО Таблица4УбралПовторяющиеся.Номенклатура = Таблица2Исходная.Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2.Номенклатура КАК НоменклатураТаб1,
ВЫБОР
КОГДА Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2.Количество ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2.Количество
КОНЕЦ КАК КоличествоТаб1,
Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1.Номенклатура КАК НоменклатураТаб2,
ВЫБОР
КОГДА Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1.Количество ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1.Количество
КОНЕЦ КАК КоличествоТаб2,
ВЫБОР
КОГДА Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2.Количество ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2.Количество
КОНЕЦ - ВЫБОР
КОГДА Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1.Количество ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1.Количество
КОНЕЦ КАК Разница
ИЗ
Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1 КАК Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1
ЛЕВОЕ СОЕДИНЕНИЕ Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2 КАК Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2
ПО (Таблица6ДобавилКТаблице2ПрисутствующиеТолькоВТаб1.Номенклатура = Таблица5ДобавилКТаблице1ПрисутствующиеТолькоВТаб2.Номенклатура)
По теме из базы знаний
Найденные решения
5. soft_wind 22.01.20 17:30 Сейчас в теме
э э э, ну вы даете! на франчайзи учитесь? эт вроде как они так г..кодят


ВЫБРАТЬ "Н1" КАК Номенклатура, 10 КАК Количество
ПОМЕСТИТЬ Таблица1Исходная
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н2", 5
;
ВЫБРАТЬ "Н1" КАК Номенклатура, 9 КАК Количество
ПОМЕСТИТЬ Таблица2Исходная
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н2", 5
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н3", 3
;
////////////////////////////////////////
Выбрать
ЕстьNull(т1.Номенклатура, т2.Номенклатура) как Номенклатура,
ЕстьNull(т1.Количество, 0) как КоличествоТаб1,
ЕстьNull(т2.Количество, 0) как КоличествоТаб2,
ЕстьNull(т1.Количество, 0)
-ЕстьNull(т2.Количество, 0) как Разница
из
Таблица1Исходная т1
полное соединение Таблица2Исходная т2
по т1.Номенклатура = т2.Номенклатура
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starjevschik 22.01.20 17:12 Сейчас в теме
В общем случае так:
1) внятно поставить задачу
2) сделать как можешь, чтобы работало правильно
3) посмотреть на реальной базе, нужна ли оптимизация.
В 99% случаях на последний вопрос ответ будет отрицательный, на этом работу можно сдавать заказчику.
В конкретно этом случае надо сначала сделать пп 1 и 2.
user774630; +1 Ответить
4. applesound 1 22.01.20 17:27 Сейчас в теме
Уточните. Что именно не понятно?
Конечная цель: не получить и результат и оптимизированное решение. Результат получен. Решение страдает.
8. bad_wag 48 22.01.20 19:03 Сейчас в теме
(4)
ВЫБРАТЬ
	"Н1" КАК Номенклатура,
	8 КАК Количество
ПОМЕСТИТЬ Таблица1Исходная

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Н2",
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Н1",
	2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	"Н1" КАК Номенклатура,
	9 КАК Количество
ПОМЕСТИТЬ Таблица2Исходная

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Н2",
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Н3",
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Н2",
	2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Т.Номенклатура КАК Номенклатура,
	СУММА(Т.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Таб1ГРуп
ИЗ
	Таблица1Исходная КАК Т

СГРУППИРОВАТЬ ПО
	Т.Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Т.Номенклатура КАК Номенклатура,
	СУММА(Т.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Таб2Груп
ИЗ
	Таблица2Исходная КАК Т

СГРУППИРОВАТЬ ПО
	Т.Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Т1.Номенклатура КАК Номенклатура,
	Т1.Количество - ЕСТЬNULL(Т2.Количество, 0) КАК Количество
ИЗ
	ВТ_Таб1ГРуп КАК Т1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Таб2Груп КАК Т2
		ПО Т1.Номенклатура = Т2.Номенклатура

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Т2.Номенклатура,
	-Т2.Количество
ИЗ
	ВТ_Таб2ГРуп КАК Т2
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Таб1Груп КАК Т1
		ПО Т1.Номенклатура = Т2.Номенклатура
ГДЕ
	 Т1.Номенклатура ЕСТЬ NULL

Показать
3. user1274438 22.01.20 17:15 Сейчас в теме
Почти со 100% вероятностью убирать ПОЛНОЕ СОЕДИНЕНИЕ
5. soft_wind 22.01.20 17:30 Сейчас в теме
э э э, ну вы даете! на франчайзи учитесь? эт вроде как они так г..кодят


ВЫБРАТЬ "Н1" КАК Номенклатура, 10 КАК Количество
ПОМЕСТИТЬ Таблица1Исходная
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н2", 5
;
ВЫБРАТЬ "Н1" КАК Номенклатура, 9 КАК Количество
ПОМЕСТИТЬ Таблица2Исходная
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н2", 5
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н3", 3
;
////////////////////////////////////////
Выбрать
ЕстьNull(т1.Номенклатура, т2.Номенклатура) как Номенклатура,
ЕстьNull(т1.Количество, 0) как КоличествоТаб1,
ЕстьNull(т2.Количество, 0) как КоличествоТаб2,
ЕстьNull(т1.Количество, 0)
-ЕстьNull(т2.Количество, 0) как Разница
из
Таблица1Исходная т1
полное соединение Таблица2Исходная т2
по т1.Номенклатура = т2.Номенклатура
Показать
6. applesound 1 22.01.20 17:31 Сейчас в теме
7. bad_wag 48 22.01.20 18:38 Сейчас в теме
(6) Что за результат в вопросе? по какому алгоритму должен быть получен? И почему он не совпадает с тем, что ваш запрос выдает?
alex-l19041; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот