Понимание логики запроса: левое/правое соединение и одна пустая таблица
День добрый, уважаемые пользователи Инфостарта!
Поясните пожалуйста ошибку в логике моего запроса.
Загвоздка в том, что в моем представлении было: при левом (правом) соединении в случае, если в присоединяемой таблице значений нет, то данные из таблицы к которой присоединяем - все равно выводятся. Но в приведенном ниже запросе это утверждение не работает.
!!!Но если мы этот же запрос разделим на Временные таблицы, то работает - а почему?
Поясните пожалуйста ошибку в логике моего запроса.
Загвоздка в том, что в моем представлении было: при левом (правом) соединении в случае, если в присоединяемой таблице значений нет, то данные из таблицы к которой присоединяем - все равно выводятся. Но в приведенном ниже запросе это утверждение не работает.
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД КАК КодТНВЭД,
ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА ЕСТЬNULL(ПоступлениеТоваровУслугТовары.Вес, 0) > 0
ТОГДА ПоступлениеТоваровУслугТовары.Вес
ИНАЧЕ ПоступлениеТоваровУслугТовары.Количество
КОНЕЦ КАК Количество,
ПоступлениеТоваровУслугТовары.Цена КАК Цена,
ПоступлениеТоваровУслугТовары.Сумма * ПоступлениеТоваровУслугТовары.КурсУпр КАК СуммаРуб,
ПоступлениеТоваровУслугРазделыГТД.СуммаПошлины КАК СуммаПошлины,
ПоступлениеТоваровУслугРазделыГТД.СуммаНДС КАК СуммаНДС
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.РазделыГТД КАК ПоступлениеТоваровУслугРазделыГТД
ПО ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД = ПоступлениеТоваровУслугРазделыГТД.КодТНВЭД
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = &Ссылка
И ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка
УПОРЯДОЧИТЬ ПО
НомерСтроки
ИТОГИ
СУММА(Сумма)
ПО
ОБЩИЕ,
КодТНВЭД
Показать!!!Но если мы этот же запрос разделим на Временные таблицы, то работает - а почему?
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД КАК КодТНВЭД,
ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА ЕСТЬNULL(ПоступлениеТоваровУслугТовары.Вес, 0) > 0
ТОГДА ПоступлениеТоваровУслугТовары.Вес
ИНАЧЕ ПоступлениеТоваровУслугТовары.Количество
КОНЕЦ КАК Количество,
ПоступлениеТоваровУслугТовары.Цена КАК Цена,
ПоступлениеТоваровУслугТовары.Сумма * ПоступлениеТоваровУслугТовары.КурсУпр КАК СуммаРуб
ПОМЕСТИТЬ ВТ1
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = &Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ПоступлениеТоваровУслугРазделыГТД.Ссылка КАК Ссылка,
ПоступлениеТоваровУслугРазделыГТД.НомерСтроки КАК НомерСтроки,
ПоступлениеТоваровУслугРазделыГТД.КодТНВЭД КАК КодТНВЭД,
ПоступлениеТоваровУслугРазделыГТД.ТаможеннаяСтоимость КАК ТаможеннаяСтоимость,
ПоступлениеТоваровУслугРазделыГТД.СтавкаПошлины КАК СтавкаПошлины,
ПоступлениеТоваровУслугРазделыГТД.СуммаПошлины КАК СуммаПошлины,
ПоступлениеТоваровУслугРазделыГТД.СуммаНДС КАК СуммаНДС,
ПоступлениеТоваровУслугРазделыГТД.СтавкаНДС КАК СтавкаНДС
ПОМЕСТИТЬ ВТ2
ИЗ
Документ.ПоступлениеТоваровУслуг.РазделыГТД КАК ПоступлениеТоваровУслугРазделыГТД
ГДЕ
ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ1.НомерСтроки КАК НомерСтроки,
ВТ1.КодТНВЭД КАК КодТНВЭД,
ВТ1.Сумма КАК Сумма,
ВТ1.Номенклатура КАК Номенклатура,
ВТ1.Количество КАК Количество,
ВТ1.Цена КАК Цена,
ВТ1.СуммаРуб КАК СуммаРуб,
ВТ2.СуммаПошлины КАК СуммаПошлины,
ВТ2.СуммаНДС КАК СуммаНДС
ИЗ
ВТ1 КАК ВТ1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
ПО (ВТ1.Номенклатура.КодТНВЭД = ВТ2.КодТНВЭД)
УПОРЯДОЧИТЬ ПО
НомерСтроки
ИТОГИ
СУММА(Сумма)
ПО
ОБЩИЕ,
КодТНВЭД
ПоказатьПо теме из базы знаний
Найденные решения
(1)
При левом соединении с наложением фильтра на присоединяемую таблицу, запрос отрабатывает аналогично внутреннему соединению. Это аксиома в 1С.
ГДЕ
И ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка
И ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка
При левом соединении с наложением фильтра на присоединяемую таблицу, запрос отрабатывает аналогично внутреннему соединению. Это аксиома в 1С.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
При левом соединении с наложением фильтра на присоединяемую таблицу, запрос отрабатывает аналогично внутреннему соединению. Это аксиома в 1С.
ГДЕ
И ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка
И ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка = &Ссылка
При левом соединении с наложением фильтра на присоединяемую таблицу, запрос отрабатывает аналогично внутреннему соединению. Это аксиома в 1С.
(6) Раскройте свою мысль.
Будет также аналогично внутреннему соединению. Просто нужно представлять себе этот механизм.
Сначала делается обычное левое соединение. Затем, если есть условие на вторую таблицу, то уже с полученными данными отсекаются по этому фильтру.
В случае: "ПрисоединяемаяТаблица.Реквизит ЕСТЬ NULL" отсекутся все записи, где во второй таблице не Реквизит ЕСТЬ NULL.
Будет также аналогично внутреннему соединению. Просто нужно представлять себе этот механизм.
Сначала делается обычное левое соединение. Затем, если есть условие на вторую таблицу, то уже с полученными данными отсекаются по этому фильтру.
В случае: "ПрисоединяемаяТаблица.Реквизит ЕСТЬ NULL" отсекутся все записи, где во второй таблице не Реквизит ЕСТЬ NULL.
(7) я рассуждал с точки зрения результата:
1) При внутреннем соединении будут получены те пары записей исходных таблиц, составляющие которых удовлетворяют условию соединения.
2) Если взять левое соединение (пусть "Т1 левое соедниение Т2 по Т1.Р1 = Т2.Р2"), то если условие не выполняется, мы получим в том числе и записи вида <Т1.Реквизит, NULL>, и, наложив условие вида "ГДЕ Т2.Р2 > 2", мы получим пары, запись из Т2 в которых не NULL, т.е. как раз аналогично внутреннему соединению.
3) Если же секция "ГДЕ" будет, например, "ГДЕ Т2.Р1 ЕСТЬ NULL", то мы наоборот получим результаты, не удовлетворяющие условию соединения, т.е. РезультатЛевогоСоедиения минус РезультатВнутреннегоСоединения.
1) При внутреннем соединении будут получены те пары записей исходных таблиц, составляющие которых удовлетворяют условию соединения.
2) Если взять левое соединение (пусть "Т1 левое соедниение Т2 по Т1.Р1 = Т2.Р2"), то если условие не выполняется, мы получим в том числе и записи вида <Т1.Реквизит, NULL>, и, наложив условие вида "ГДЕ Т2.Р2 > 2", мы получим пары, запись из Т2 в которых не NULL, т.е. как раз аналогично внутреннему соединению.
3) Если же секция "ГДЕ" будет, например, "ГДЕ Т2.Р1 ЕСТЬ NULL", то мы наоборот получим результаты, не удовлетворяющие условию соединения, т.е. РезультатЛевогоСоедиения минус РезультатВнутреннегоСоединения.
День добрый, спасибо всем откликнувшимся!!! Вы внесли новую информацию в копилку знаний!!!
Переписал запрос след. образом - заработало.
Пока складывается впечатление, что способ с временными таблицами будет предпочтительнее, в плане производительности? Чем тот, что приведен ниже.
Переписал запрос след. образом - заработало.
Пока складывается впечатление, что способ с временными таблицами будет предпочтительнее, в плане производительности? Чем тот, что приведен ниже.
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД КАК КодТНВЭД,
ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА ЕСТЬNULL(ПоступлениеТоваровУслугТовары.Вес, 0) > 0
ТОГДА ПоступлениеТоваровУслугТовары.Вес
ИНАЧЕ ПоступлениеТоваровУслугТовары.Количество
КОНЕЦ КАК Количество,
ПоступлениеТоваровУслугТовары.Цена КАК Цена,
ПоступлениеТоваровУслугТовары.Сумма * ПоступлениеТоваровУслугТовары.КурсУпр КАК СуммаРуб,
ПоступлениеТоваровУслугРазделыГТД.СуммаПошлины КАК СуммаПошлины,
ПоступлениеТоваровУслугРазделыГТД.СуммаНДС КАК СуммаНДС
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.РазделыГТД КАК ПоступлениеТоваровУслугРазделыГТД
ПО ПоступлениеТоваровУслугТовары.Номенклатура.КодТНВЭД = ПоступлениеТоваровУслугРазделыГТД.КодТНВЭД
И ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = ПоступлениеТоваровУслугРазделыГТД.Ссылка.Ссылка
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = &Ссылка
УПОРЯДОЧИТЬ ПО
НомерСтроки
ИТОГИ
СУММА(Сумма)
ПО
ОБЩИЕ,
КодТНВЭД
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот