Дублирование записей при выполнении запроса

1. user1820578 05.08.22 01:47 Сейчас в теме
Доброго времени суток.
Столкнулся со следующей проблемой: если добавить в select поле СкладРаспиловОстаткиИОбороты.Обработка, то происходит дублирование для тех записей, где присутствует то самое поле. При этом, если его убрать, то дублирование пропадает. Само поле является ссылкой на справочник.

ВЫБРАТЬ
	ВсеБлоки.НомерБлока КАК НомерБлока,
	ВсеРаспилы.НомерРаспила КАК НомерРаспила,
	НомераРаспиленныхБлоков.Ссылка.Дата КАК ДатаРаспила,
	ДокументРаспилы.Сотрудник КАК СотрудникРаспил,
	ВсеБлоки.Объем КАК ОбъемБлока,
	ВсеРаспилы.Длина * ВсеРаспилы.Толщина * ВсеРаспилы.Ширина / 1000000 КАК ОбьемРаспила,
	ВсеРаспилы.Длина * ВсеРаспилы.Ширина / 10000 КАК ПлощадьРаспила,
	ОкантовкаРаспилы.Длина * ОкантовкаРаспилы.Толщина * ОкантовкаРаспилы.Ширина / 1000000 КАК ОбьемПродукции,
	ОкантовкаРаспилы.Длина * ОкантовкаРаспилы.Ширина / 10000 КАК ПлощадьПродукции,
	ОкантовкаРаспилы.Количество КАК КоличествоПродукции,
	ВсеБлоки.Месторождение КАК Месторождение,
	ОкантовкаРаспилы.ВидПродукции КАК ВидПродукции,
	ОкантовкаРаспилы.Количество КАК КоличествоОкантовка,
	ОкантовкаРаспилы.Объем КАК ОбъемОкантовка,
	ОкантовкаРаспилы.Площадь КАК ПлощадьОкантовка,
	ОкантовкаРаспилы.Ссылка.Сотрудник КАК СотрудникОкантовка,
	ОбработкаРаспилы.Площадь КАК ПлощадьОбработки
ИЗ
	РегистрНакопления.СкладБлоков.ОстаткиИОбороты(, , авто, , ) КАК СкладБлоковОстаткиИОбороты
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Блоки КАК ВсеБлоки
		ПО (ВсеБлоки.НомерБлока = СкладБлоковОстаткиИОбороты.НомерБлока)
		ПРАВОЕ СОЕДИНЕНИЕ РегистрНакопления.СкладРаспилов.ОстаткиИОбороты КАК СкладРаспиловОстаткиИОбороты
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Распилы КАК ВсеРаспилы
			ПО (СкладРаспиловОстаткиИОбороты.НомерРаспила = ВсеРаспилы.НомерРаспила)
		ПО (ВсеРаспилы.НомерБлока = ВсеБлоки.НомерБлока)
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ФильтрСписанные.НомерБлока КАК НомерБлока,
			ФильтрСписанные.СписатьБлок КАК СписатьБлок,
			НомераРаспиленныхБлоков.Ссылка КАК Ссылка,
			НомераРаспиленныхБлоков.НомерСтроки КАК НомерСтроки,
			НомераРаспиленныхБлоков.НомерБлока КАК НомерБлока1,
			НомераРаспиленныхБлоков.НомерРаспила КАК НомерРаспила,
			НомераРаспиленныхБлоков.Длина КАК Длина,
			НомераРаспиленныхБлоков.Ширина КАК Ширина,
			НомераРаспиленныхБлоков.Толщина КАК Толщина,
			НомераРаспиленныхБлоков.Площадь КАК Площадь,
			НомераРаспиленныхБлоков.Объем КАК Объем,
			НомераРаспиленныхБлоков.СписатьБлок КАК СписатьБлок1
		ИЗ
			(ВЫБРАТЬ
				НомераРаспиленныхБлоков.НомерБлока КАК НомерБлока,
				НомераРаспиленныхБлоков.СписатьБлок КАК СписатьБлок
			ИЗ
				Документ.Распил.Распилы КАК НомераРаспиленныхБлоков
			ГДЕ
				НомераРаспиленныхБлоков.СписатьБлок = ИСТИНА
			
			СГРУППИРОВАТЬ ПО
				НомераРаспиленныхБлоков.НомерБлока,
				НомераРаспиленныхБлоков.СписатьБлок) КАК ФильтрСписанные
				ЛЕВОЕ СОЕДИНЕНИЕ Документ.Распил.Распилы КАК НомераРаспиленныхБлоков
				ПО (НомераРаспиленныхБлоков.НомерБлока = ФильтрСписанные.НомерБлока)
					И (НомераРаспиленныхБлоков.СписатьБлок = ИСТИНА)) КАК НомераРаспиленныхБлоков
		ПО (ВсеБлоки.НомерБлока = НомераРаспиленныхБлоков.НомерБлока)
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.Окантовка.Распилы КАК ОкантовкаРаспилы
			ЛЕВОЕ СОЕДИНЕНИЕ Документ.Окантовка КАК Окантовка
			ПО (ОкантовкаРаспилы.Ссылка = Окантовка.Ссылка)
		ПО (ОкантовкаРаспилы.НомерРаспила = СкладРаспиловОстаткиИОбороты.НомерРаспила)
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.Распил КАК ДокументРаспилы
		ПО (ВсеРаспилы.Регистратор = ДокументРаспилы.Ссылка)
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.Обработка.Распилы КАК ОбработкаРаспилы
		ПО (ВсеРаспилы.НомерРаспила = ОбработкаРаспилы.НомерРаспила) 
ГДЕ ВсеБлоки.НомерБлока = "9731"
Показать
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
2. koloboc74 83 05.08.22 04:36 Сейчас в теме
Разбейте по частям запрос в ВТ вам будет проще
А почему у вас Правое соединение в запросе .. И зачем использовать вложенный запрос это зло....
user1820578; PhoenixAOD; +2 Ответить
3. starjevschik 05.08.22 07:17 Сейчас в теме
Да, правое соединение вижу, пожалуй, впервые. Экзотика. Приятно, что среди коллег по 1С есть такие продвинутые знатоки запросов, это редкое явление.
В этой таблице, надо полагать, несколько записей по каждому критерию соединения. Вот СУБД и выдает несколько записей. Почему "дублируется"? Что попросили, то и получили. Соглашусь с коллегой (2), для отладки удобно поделить на несколько запросов, потом можно обратно вернуть в один, если это зачем-то нужно.
user1820578; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. koloboc74 83 05.08.22 04:36 Сейчас в теме
Разбейте по частям запрос в ВТ вам будет проще
А почему у вас Правое соединение в запросе .. И зачем использовать вложенный запрос это зло....
user1820578; PhoenixAOD; +2 Ответить
3. starjevschik 05.08.22 07:17 Сейчас в теме
Да, правое соединение вижу, пожалуй, впервые. Экзотика. Приятно, что среди коллег по 1С есть такие продвинутые знатоки запросов, это редкое явление.
В этой таблице, надо полагать, несколько записей по каждому критерию соединения. Вот СУБД и выдает несколько записей. Почему "дублируется"? Что попросили, то и получили. Соглашусь с коллегой (2), для отладки удобно поделить на несколько запросов, потом можно обратно вернуть в один, если это зачем-то нужно.
user1820578; +1 Ответить
5. RustamZz 05.08.22 07:33 Сейчас в теме
(3) Я лично первый раз вижу обращение к таблице остатков и оборотов из которой не берется ни остаток, ни оборот. И вишенка на торте ГДЕ ВсеБлоки.НомерБлока = "9731"
6. starjevschik 05.08.22 08:00 Сейчас в теме
(5) ну последнее условие очевидно отладочное. Я тоже так делаю, главное не забыть это стереть, когда записываешь в рабочую базу.
Про остальное что мы можем сказать, не зная ни задачи, ни структуры базы? Человек, которые пользуется правыми соединениями, вряд ли не знает, какие таблицы ему нужны. Все же это довольно глубокое погружение в sql.
7. RustamZz 05.08.22 08:02 Сейчас в теме
(6)
когда записываешь в рабочую базу
или выкладываешь на форум...
8. user1820578 05.08.22 10:41 Сейчас в теме
(3) (2) Большое спасибо, благодаря совету выяснил в чем ошибка.
Использую right join, чтобы вытащить все блоки по которым выполнялся распил. Можно было бы присоединять РегистрСведений.Блоки к РегистрСведений.Распилы, чтобы использовать left join, но почему то решил, так оставить, ведь работало же, пока не нужно было изменять отчет)

p.s. слышал, что использование right join плохая практика, но выяснял почему
4. RustamZz 05.08.22 07:28 Сейчас в теме
(2) У вас, коллега, только два вопроса? Это же не просто ужас, это ужас-ужас. Запрос стереть, базу удалить, диск отформатировать. У меня вариантов исправить это все - нет. Автору неуд и на осень.
Оставьте свое сообщение

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