Как сделать левое соединение ДЕЙСТВИТЕЛЬНО Левым ?

1. ResAndDev 14.01.19 11:01 Сейчас в теме
Приветствую.

Что я ожидаю, выполняя левое соединение - берутся ВСЕ поля из левой таблицы и дополняются данными из правой таблицы, которые удовлетворяют условиям соединения.

Тогда почему итоговая таблица дополняется всеми данными из ПРАВОЙ таблицы удовлетворяющими условиям соединения ?
ВЫБРАТЬ
	НачислениеЗарплатыОсновныеНачисления.НомерСтроки,
	НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник,
	НачислениеЗарплатыОсновныеНачисления.ВидРасчета,
	НачислениеЗарплатыОсновныеНачисления.ДатаНачала,
	КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ДатаОкончания,
	НачислениеЗарплатыОсновныеНачисления.ГрафикРаботы
ПОМЕСТИТЬ ВТ_ДатнныеДокумента
ИЗ
	Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
ГДЕ
	НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
	И НачислениеЗарплатыОсновныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланвидовРасчета.ОсновныеНачисления.Оклад)

ИНДЕКСИРОВАТЬ ПО
	Сотрудник
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МАКСИМУМ(СведенияОСотрудниках.Период) КАК Период,
	СведенияОСотрудниках.Сотрудник,
	ВТ_ДатнныеДокумента.НомерСтроки
ПОМЕСТИТЬ ВТ_Оклады
ИЗ
	ВТ_ДатнныеДокумента КАК ВТ_ДатнныеДокумента
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
		ПО ВТ_ДатнныеДокумента.Сотрудник = СведенияОСотрудниках.Сотрудник
			И ВТ_ДатнныеДокумента.ДатаНачала >= СведенияОСотрудниках.Период
ГДЕ
	НЕ СведенияОСотрудниках.Сотрудник ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
	СведенияОСотрудниках.Сотрудник,
	ВТ_ДатнныеДокумента.НомерСтроки
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СведенияОСотрудниках.Сотрудник КАК Сотрудник,
	СведенияОСотрудниках.Оклад КАК Размер,
	ВТ_Оклады.НомерСтроки
ПОМЕСТИТЬ ВТ_РасчитанныйОклад
ИЗ
	ВТ_Оклады КАК ВТ_Оклады
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
		ПО ВТ_Оклады.Период = СведенияОСотрудниках.Период
			И ВТ_Оклады.Сотрудник = СведенияОСотрудниках.Сотрудник

ИНДЕКСИРОВАТЬ ПО
	Сотрудник
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ДатнныеДокумента.НомерСтроки,
	ВТ_ДатнныеДокумента.Сотрудник,
	ВТ_ДатнныеДокумента.ВидРасчета,
	ВТ_ДатнныеДокумента.ДатаНачала,
	ВТ_ДатнныеДокумента.ДатаОкончания,
	ВТ_ДатнныеДокумента.ГрафикРаботы,
	ЕСТЬNULL(ВТ_РасчитанныйОклад.Размер, 0) КАК Размер
ИЗ
	ВТ_ДатнныеДокумента КАК ВТ_ДатнныеДокумента
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РасчитанныйОклад КАК ВТ_РасчитанныйОклад
		ПО ВТ_ДатнныеДокумента.НомерСтроки = ВТ_РасчитанныйОклад.НомерСтроки
Показать
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. singlych 14.01.19 11:06 Сейчас в теме
5. vlad636 4 14.01.19 11:08 Сейчас в теме
(1) Ага, запрос в студию.
+
6. lefthander 14.01.19 11:08 Сейчас в теме
(1)Или не левое, или в правой есть все что соединилось с левой :)
+
7. Boneman 298 14.01.19 11:09 Сейчас в теме
(1)
Что я ожидаю, выполняя левое соединение - берутся ВСЕ поля из левой таблицы и дополняются данными из правой таблицы, которые удовлетворяют условиям соединения.

ровно так и должно быть.

(1)
Тогда почему итоговая таблица дополняется всеми данными из ПРАВОЙ таблицы удовлетворяющими условиям соединения ?

значит что-то не так сделал.
Показывай свой запрос, или код...чтобы предметно поговорить
+
10. singlych 14.01.19 11:16 Сейчас в теме
(1)
ГДЕ
НЕ СведенияОСотрудниках.Сотрудник ЕСТЬ NULL


ну, вот тут отрезаются поля из левой таблицы, и получается внутреннее
+
11. Vitaly1C8 14.01.19 17:20 Сейчас в теме
(1) Потому что так работает ЛЕВОЕ соединение !
Для того чтобы было так как ты хочешь, (прям левое)
нужно чтобы в правой таблице всего ОДНА запись удовлетворяла условию соединения.
+
3. kumi2012 103 14.01.19 11:06 Сейчас в теме
Покажите пример.
+
4. SedovSU@mail.ru 297 14.01.19 11:08 Сейчас в теме
Насколько я помню, если Вы все условия прописывает в связи то будет работать как левое соединение, если вы условия пишите в разделе "ГДЕ" то тогда у вас будет аналог внутреннего соединения. Посмотрите и сделайте условия в связях
+
8. SedovSU@mail.ru 297 14.01.19 11:14 Сейчас в теме
Вот пример. Есть справочник контрагенты и документ Заказ поставщику. Например по справочнику контрагенты хочу подтянуть из правой таблицы контрагентов сумму всех заказов за какой то период. Так вот чтобы левое соединение было левым я прям в условиях связи напишу критерий отбора

ВЫБРАТЬ
Контрагенты.Ссылка,
СУММА(ЗаказПоставщику.СуммаДокумента) КАК СуммаДокумента
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказПоставщику
ПО Контрагенты.Ссылка = ЗаказПоставщику.Контрагент
И (ЗаказПоставщику.Дата МЕЖДУ &НачалоПериода И &КонецПериода)

СГРУППИРОВАТЬ ПО
Контрагенты.Ссылка

Если же я это условия напишу/ размещу через ГДЕ ЗаказПоставщику.Дата МЕЖДУ &НачалоПериода И &КонецПериода то тогда у меня будет не весь список контрагентов а тот у которых есть заказы поставщику
+
9. SedovSU@mail.ru 297 14.01.19 11:15 Сейчас в теме
При указании условия в разделе ГДЕ у вас программа (запрос) с имитирует внутреннее соединение, хотя у вас будет написано Левое
+
Внимание! Тема сдана в архив

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