Понимание логики запроса: левое/правое соединение и одна пустая таблица

1. user659168_xec8787 3 22.08.17 16:31 Сейчас в теме
День добрый, уважаемые пользователи Инфостарта!
Поясните пожалуйста ошибку в логике моего запроса.
Загвоздка в том, что в моем представлении было: при левом (правом) соединении в случае, если в присоединяемой таблице значений нет, то данные из таблицы к которой присоединяем - все равно выводятся. Но в приведенном ниже запросе это утверждение не работает.
ВЫБРАТЬ
	ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
	ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД КАК КодТНВЭД,
	ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
	ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
	ВЫБОР
		КОГДА ЕСТЬNULL(ПоступлениеТоваровУслугТовары.Вес, 0) > 0
			ТОГДА ПоступлениеТоваровУслугТовары.Вес
		ИНАЧЕ ПоступлениеТоваровУслугТовары.Количество
	КОНЕЦ КАК Количество,
	ПоступлениеТоваровУслугТовары.Цена КАК Цена,
	ПоступлениеТоваровУслугТовары.Сумма * ПоступлениеТоваровУслугТовары.КурсУпр КАК СуммаРуб,
	ПоступлениеТоваровУслугРазделыГТД.СуммаПошлины КАК СуммаПошлины,
	ПоступлениеТоваровУслугРазделыГТД.СуммаНДС КАК СуммаНДС
ИЗ
	Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.РазделыГТД КАК ПоступлениеТоваровУслугРазделыГТД
		ПО ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД = ПоступлениеТоваровУслугРазделыГТД.КодТНВЭД
ГДЕ
	ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = &Ссылка
	И ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка

УПОРЯДОЧИТЬ ПО
	НомерСтроки
ИТОГИ
	СУММА(Сумма)
ПО
	ОБЩИЕ,
	КодТНВЭД
Показать


!!!Но если мы этот же запрос разделим на Временные таблицы, то работает - а почему?

ВЫБРАТЬ
	ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
	ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД КАК КодТНВЭД,
	ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
	ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
	ВЫБОР
		КОГДА ЕСТЬNULL(ПоступлениеТоваровУслугТовары.Вес, 0) > 0
			ТОГДА ПоступлениеТоваровУслугТовары.Вес
		ИНАЧЕ ПоступлениеТоваровУслугТовары.Количество
	КОНЕЦ КАК Количество,
	ПоступлениеТоваровУслугТовары.Цена КАК Цена,
	ПоступлениеТоваровУслугТовары.Сумма * ПоступлениеТоваровУслугТовары.КурсУпр КАК СуммаРуб
ПОМЕСТИТЬ ВТ1
ИЗ
	Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
	ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПоступлениеТоваровУслугРазделыГТД.Ссылка КАК Ссылка,
	ПоступлениеТоваровУслугРазделыГТД.НомерСтроки КАК НомерСтроки,
	ПоступлениеТоваровУслугРазделыГТД.КодТНВЭД КАК КодТНВЭД,
	ПоступлениеТоваровУслугРазделыГТД.ТаможеннаяСтоимость КАК ТаможеннаяСтоимость,
	ПоступлениеТоваровУслугРазделыГТД.СтавкаПошлины КАК СтавкаПошлины,
	ПоступлениеТоваровУслугРазделыГТД.СуммаПошлины КАК СуммаПошлины,
	ПоступлениеТоваровУслугРазделыГТД.СуммаНДС КАК СуммаНДС,
	ПоступлениеТоваровУслугРазделыГТД.СтавкаНДС КАК СтавкаНДС
ПОМЕСТИТЬ ВТ2
ИЗ
	Документ.ПоступлениеТоваровУслуг.РазделыГТД КАК ПоступлениеТоваровУслугРазделыГТД
ГДЕ
	ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ1.НомерСтроки КАК НомерСтроки,
	ВТ1.КодТНВЭД КАК КодТНВЭД,
	ВТ1.Сумма КАК Сумма,
	ВТ1.Номенклатура КАК Номенклатура,
	ВТ1.Количество КАК Количество,
	ВТ1.Цена КАК Цена,
	ВТ1.СуммаРуб КАК СуммаРуб,
	ВТ2.СуммаПошлины КАК СуммаПошлины,
	ВТ2.СуммаНДС КАК СуммаНДС
ИЗ
	ВТ1 КАК ВТ1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
		ПО (ВТ1.Номенклатура.КодТНВЭД = ВТ2.КодТНВЭД)

УПОРЯДОЧИТЬ ПО
	НомерСтроки
ИТОГИ
	СУММА(Сумма)
ПО
	ОБЩИЕ,
	КодТНВЭД
Показать
По теме из базы знаний
Найденные решения
5. spacecraft 22.08.17 17:34 Сейчас в теме
(1)
ГДЕ

И ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка


При левом соединении с наложением фильтра на присоединяемую таблицу, запрос отрабатывает аналогично внутреннему соединению. Это аксиома в 1С.
Djo82; bondaleksey; VladC#; Letos; user1387090; HIVvich; Alexkoz1980; windows98a; alex-l19041; RFP; user659168_xec8787; +11 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Boneman 298 22.08.17 17:00 Сейчас в теме
(1) да, условие надо пихать прямо в условия связи таблиц, а не на вкладке условия
18101986; user659168_xec8787; +2 Ответить
5. spacecraft 22.08.17 17:34 Сейчас в теме
(1)
ГДЕ

И ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка


При левом соединении с наложением фильтра на присоединяемую таблицу, запрос отрабатывает аналогично внутреннему соединению. Это аксиома в 1С.
Djo82; bondaleksey; VladC#; Letos; user1387090; HIVvich; Alexkoz1980; windows98a; alex-l19041; RFP; user659168_xec8787; +11 Ответить
6. comptr 31 22.08.17 18:54 Сейчас в теме
(5) а если будет условие вида "ПрисоединяемаяТаблица.Реквизит ЕСТЬ NULL", тогда получится наоборот.
7. spacecraft 22.08.17 20:08 Сейчас в теме
(6) Раскройте свою мысль.
Будет также аналогично внутреннему соединению. Просто нужно представлять себе этот механизм.
Сначала делается обычное левое соединение. Затем, если есть условие на вторую таблицу, то уже с полученными данными отсекаются по этому фильтру.
В случае: "ПрисоединяемаяТаблица.Реквизит ЕСТЬ NULL" отсекутся все записи, где во второй таблице не Реквизит ЕСТЬ NULL.
user659168_xec8787; +1 Ответить
8. comptr 31 22.08.17 21:16 Сейчас в теме
(7) я рассуждал с точки зрения результата:
1) При внутреннем соединении будут получены те пары записей исходных таблиц, составляющие которых удовлетворяют условию соединения.
2) Если взять левое соединение (пусть "Т1 левое соедниение Т2 по Т1.Р1 = Т2.Р2"), то если условие не выполняется, мы получим в том числе и записи вида <Т1.Реквизит, NULL>, и, наложив условие вида "ГДЕ Т2.Р2 > 2", мы получим пары, запись из Т2 в которых не NULL, т.е. как раз аналогично внутреннему соединению.
3) Если же секция "ГДЕ" будет, например, "ГДЕ Т2.Р1 ЕСТЬ NULL", то мы наоборот получим результаты, не удовлетворяющие условию соединения, т.е. РезультатЛевогоСоедиения минус РезультатВнутреннегоСоединения.
2. Skill 22.08.17 16:56 Сейчас в теме
В первом варианте у вас условие накладывается на результат соединения, а во втором варианте условие отработает по другому.
3. VmvLer 22.08.17 16:59 Сейчас в теме
да, достаточно посмотреть на секции ГДЕ и не морочить голову
9. user659168_xec8787 3 23.08.17 16:05 Сейчас в теме
День добрый, спасибо всем откликнувшимся!!! Вы внесли новую информацию в копилку знаний!!!
Переписал запрос след. образом - заработало.
Пока складывается впечатление, что способ с временными таблицами будет предпочтительнее, в плане производительности? Чем тот, что приведен ниже.
ВЫБРАТЬ
	ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
	ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД КАК КодТНВЭД,
	ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
	ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
	ВЫБОР
		КОГДА ЕСТЬNULL(ПоступлениеТоваровУслугТовары.Вес, 0) > 0
			ТОГДА ПоступлениеТоваровУслугТовары.Вес
		ИНАЧЕ ПоступлениеТоваровУслугТовары.Количество
	КОНЕЦ КАК Количество,
	ПоступлениеТоваровУслугТовары.Цена КАК Цена,
	ПоступлениеТоваровУслугТовары.Сумма * ПоступлениеТоваровУслугТовары.КурсУпр КАК СуммаРуб,
	ПоступлениеТоваровУслугРазделыГТД.СуммаПошлины КАК СуммаПошлины,
	ПоступлениеТоваровУслугРазделыГТД.СуммаНДС КАК СуммаНДС
ИЗ
	Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.РазделыГТД КАК ПоступлениеТоваровУслугРазделыГТД
		ПО ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД = ПоступлениеТоваровУслугРазделыГТД.КодТНВЭД
			И ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка
ГДЕ
	ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = &Ссылка

УПОРЯДОЧИТЬ ПО
	НомерСтроки
ИТОГИ
	СУММА(Сумма)
ПО
	ОБЩИЕ,
	КодТНВЭД
Показать
Оставьте свое сообщение

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