Запрос по двум таблицам

1. Si-ned 7 10.03.23 16:32 Сейчас в теме
Есть 2 таблицы. Условно таблица А содержит информацию о сотрудниках и материалах, что на них числятся:
А.Сотр А.Ном
Иванов Иван Иванович Шапка
Иванов Иван Иванович Клей
Петров Петр Петрович Ножницы
Петров Петр Петрович Бумага
Иванов Иван Иванович Бумага

И вторая таблица В содержит информацию о сотрудниках
В.Сотр В.Цех в.должность
Иванов Иван Иванович 10 цех кладовщик
Иванов Иван Иванович 15 цех грузчик
Петров Петр Петрович 9 цех слесарь

Нужно получить результат. Со второй таблицы подтянуть подразделение по сотруднику (любое из имеющихся по нем)
А.Сотр А.Ном В.Цех
Иванов Иван Иванович Шапка 10 цех
Иванов Иван Иванович Клей 10 цех
Петров Петр Петрович Ножницы 9 цех
Петров Петр Петрович Бумага 9 цех
Иванов Иван Иванович Бумага 10 цех

Чувствую, что легко, но что-то ни как)
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. spacecraft 10.03.23 16:49 Сейчас в теме
(1)
Нужно получить результат. Со второй таблицы подтянуть подразделение по сотруднику (любое из имеющихся по нем)

Если любое, то левым соединением присоединить вторую таблицу со связью по сотруднику и выбирать поле МАКСИМУМ(В.Цех)
4. glek 119 10.03.23 16:55 Сейчас в теме
(1) По какому правилу в результат попал у Иванова именно 10 цех?
6. Si-ned 7 10.03.23 17:05 Сейчас в теме
(4) первый попавшийся. Но он должен быть везде. Не так, что в половине случаев 10 цех, а в половине 15
9. tolyan_ekb 104 10.03.23 17:06 Сейчас в теме
(6)Тогда сначала отбери из первой таблицы по одному первому попавшемуся, а потом соединяй
10. DesertPunk 10.03.23 17:15 Сейчас в теме
(1)Делал так:

	ТабЗуп = новый ТаблицаЗначений;
	ТабЗуп.Колонки.Добавить("СсылкаФЛ", Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки));
	ТабЗуп.Колонки.Добавить("СсылкаДни", Новый ОписаниеТипов("Число"));
// Как-то собирал ее в запросе
       	Пока Выборка.Следующий() Цикл
		СсылкаФЛ = ЗУП.XMLString(Выборка.ФизическоеЛицо);
		СсылкаДни = ЗУП.XMLString(Выборка.Дни);
		СписокЗУП.Добавить(СсылкаФЛ);
		СтрокаТЧ = ТабЗуп.Добавить();
		СтрокаТЧ.СсылкаФЛ = СсылкаФЛ;
		СтрокаТЧ.СсылкаДни = СсылкаДни;
	КонецЦикла;
//Передавал ее в запрос в качестве параметра
      	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	УПП.Сотрудник КАК Сотрудник,
	|	УПП.СсылкаФЛ КАК СсылкаФЛ
	|ПОМЕСТИТЬ ВТ_УПП
	|ИЗ
	|	&УПП КАК УПП
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ЗУП.СсылкаФЛ КАК СсылкаФЛ,
	|	ЗУП.СсылкаДни КАК СсылкаДни
	|ПОМЕСТИТЬ ВТ_ЗУП
	|ИЗ
	|	&ЗУП КАК ЗУП
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ВТ_УПП.Сотрудник КАК Сотрудник,
	|	ВТ_ЗУП.СсылкаДни КАК СсылкаДни
	|ИЗ
	|	ВТ_УПП КАК ВТ_УПП
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЗУП КАК ВТ_ЗУП
	|		ПО ВТ_УПП.СсылкаФЛ = ВТ_ЗУП.СсылкаФЛ";
	Запрос.УстановитьПараметр("ЗУП",ТабЗуп);
	Запрос.УстановитьПараметр("УПП",ТабУПП);
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		
		СтрокаТЧ = ТабОбщ.Добавить();
		СтрокаТЧ.Сотрудник = Выборка.Сотрудник;
		СтрокаТЧ.СсылкаДни = Выборка.СсылкаДни;
		
	КонецЦикла;


Показать
11. DesertPunk 10.03.23 17:59 Сейчас в теме
(1)Подправил под тебя:
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Таб_А.Сотр КАК Сотр,
		|	Таб_А.Ном КАК Ном
		|ПОМЕСТИТЬ Таб_А
		|ИЗ
		|	&Таб_А КАК Таб_А
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	Таб_В.Сотр КАК Сотр,
		|	Таб_В.Цех КАК Цех
		|ПОМЕСТИТЬ Таб_В
		|ИЗ
		|	&Таб_В КАК Таб_В
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	Таб_А.Сотр КАК Сотр,
		|	Таб_В.Цех КАК Цех,
		|	Таб_А.Ном КАК Ном
		|ИЗ
		|	Таб_А КАК Таб_А
		|		ЛЕВОЕ СОЕДИНЕНИЕ Таб_В КАК Таб_В
		|		ПО Таб_А.Сотр = Таб_В.Сотр";
	
	Запрос.УстановитьПараметр("&Таб_А",Таб_А));	
	Запрос.УстановитьПараметр("&Таб_В",Таб_В);	
	РезультатЗапроса = Запрос.Выполнить();
	ТабОбщая = РезультатЗапроса.Выгрузить();
	

Показать
13. Said-We 10.03.23 18:13 Сейчас в теме +1 $m
Если везде один и тот же но любой цех, то в решении (11) одну таблицу подправить.


...
|////////////////////////////////////////////////////////////­­////////////////////
|ВЫБРАТЬ
| Таб_А.Сотр КАК Сотр,
| Таб_В.Цех КАК Цех,
| Таб_А.Ном КАК Ном
|ИЗ
| Таб_А КАК Таб_А
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Таб_В.Сотр КАК Сотр, Максимум(Таб_В.Цех)
| ИЗ Таб_В КАК Таб_В
| СГРУППИРОВАТЬ ПО Таб_В.Сотр) КАК Таб_В
| ПО Таб_А.Сотр = Таб_В.Сотр";
Показать
2. soft_wind 10.03.23 16:46 Сейчас в теме
сразу два варианта
1.циклом проходите по Таблице А, поиском ищете сотрудника в Таблице Б
и записываете Цех в таблицу А
2.обе таблицы передать в запрос, и соединить по сотруднику
результат выгрузить в итоговую таблицу
5. tolyan_ekb 104 10.03.23 17:03 Сейчас в теме
Иванов Иван Иванович 10 цех
Иванов Иван Иванович 15 цех
Как узнать какой Иван Иванович что взял? ))
8. Si-ned 7 10.03.23 17:05 Сейчас в теме
(5) это один и тот же сотрудник. Но в другом подразделении он совместитель
12. Said-We 10.03.23 18:08 Сейчас в теме
(8)
это один и тот же сотрудник. Но в другом подразделении он совместитель

Совместитель - это другой сотрудник, но может быть одним и тем же ФизЛицом.

В вашей схеме получается что сотрудник Иванов Иван Иванович по каждой номенклатуре будет ещё и в каждом цехе. В итоге будите сидеть и думать Иванов Иван Иванович шапок брал две или одну. :-)

У вас не получилось решить задачу, так как вы её для себя не до конца сформулировали.
7. tolyan_ekb 104 10.03.23 17:05 Сейчас в теме
Предлагаю заменить одного Ивановича на Сергеевича
14. webester 26 13.03.23 17:49 Сейчас в теме
(13)Соединяться с вложенным запросом плохая идея.1С не рекомендует так делать. Лучше все таки во временную таблицу положить. А так все верно, на первый взгляд
15. Said-We 13.03.23 18:53 Сейчас в теме
(14) Нормальная идея. Даже если 20 000 физлиц и десяток другой выданных номенклатурных позиций. Это не те объемы, что бы было принципиально и тут условие на равенство, поэтому можно и так.
16. webester 26 13.03.23 18:57 Сейчас в теме
(15) аргументы у тебя, мое почтение, чот вспомнилось )
Прикрепленные файлы:
17. Said-We 13.03.23 19:17 Сейчас в теме
(16) Тут необходимо приблизительный результат, так как таблицы не описаны откуда они берутся. В зависимости от этого, возможны варианты.
Поэтому суть данного ответа в алгоритме, а не в конечной реализации.

И да, во вложенных запросах нет ничего страшного и производительность в общем случае примерно та же +- чуть-чуть.
Более того, простейший случай. Запрос с внутренними таблицами и в одну из этих внутренних таблиц кто-то решил положить какую-то большую физическую таблицу из БД. Что будет быстрее?

1. Положить во внутреннюю таблицу эту физическую таблицу и потом уже выполнять запрос с этой внутренней таблицей.
2. Обратиться к таблице через подзапрос.

Если таблица достаточно большая, то время на создание внутренней таблицы может занимать существенную долю времени (вплоть до 50% времени выполнения запроса) и ресурсов. В итоге второй запрос будет быстрее.
Поэтому необходимо по ситуации смотреть. Что за данные. Какие индексы. Сколько данных и т.д. Без анализа источника данных, проводить какую-либо работу по оптимизации проводить бессмысленно.
Исключением может быть запрос, в котором накидали кучу таблиц во FR OM и в WH ERE давай таблицы резать. Тоже самое с JOIN. Т.е. заведомо не оптимальная работа с данными.

В данном случае просто алгоритм без какой-либо оптимизации, так как источник данных не определён.
18. webester 26 13.03.23 19:30 Сейчас в теме
(17)
Поэтому суть данного ответа в алгоритме, а не в конечной реализации

Разумеется. Я это и сказал сразу) в первом посте. Проблема с вложенными запросами не в том, что их куда-то положат или не положат. Проблема с ними в том, что оптимизатор даже приблизительно не в курсе сколько там должно быть данных. Поэтому сегодня у него может быть один план а завтра другой. И запрос сегодня отрабатывающий за доли секунд завтра начинает выполняться минуты. Это обязательно происходит в середине какого нить сложного алгоритма или отчета куда положили и забыли 100лет назад. Коллега сократил время выполнения запроса при расчете себестоимости с 20минут до 40секунд, переложив вложенный запрос во временную таблицу. В обратную сторону примеров не видел. Поэтому просто когда хочешь соединиться с вложенным запросом, стучишь себе по пальцам ) как демонстрация алгоритма конечно ОК.
19. Said-We 13.03.23 19:44 Сейчас в теме
(18) Я привел пример, когда вложенный запрос будет быстрее. Когда время создания внутренней таблицы и при необходимости индексов занимает времени и ресурсов больше, чем если этого не делать. На больших объемах данных такое бывает.

Когда в таблицах, которые связываются, например есть условие на > или на < например для простого типа данных дата и в физической таблице есть индекс по дате, а во внутренней таблице индекс не создали. Есть и другие примеры.
20. webester 26 13.03.23 20:15 Сейчас в теме
(19) Можем еще разок пройтись. кружочек конечно, но думаю нет смысла. Потому, что ты просто повторяешь те же заклинания только другими словами. Возможно на этом стоит остановиться.
Оставьте свое сообщение

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