Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Соединение в запросе и условие

Соединение в запросе и условие
Я
   salvator
 
15.12.20 - 16:49
Доброго дня!
Скажите, можно ли в запросе как-то указать с какой таблицей делать левое соединение, в зависимости от условий?
Пример такой:
К справочнику левым соединением присоединяется виртуальная таблица регистра сведений.
Затем еще одним левым соединением другая виртуальная таблица другого регистра сведений (РС-1)
Стоит задача переписать запрос: в зависимости от условия выбирать либо данные из РС-1, либо РС-2  (так же левым соединением, РС-2 пока в запросе не фигурирует).
Как лучше сделать: добавить еще одно левое соединение (к РС-2) и получать из него данные по условию (через выбор-когда или в постобработке), либо сделать два разных текста запроса в зависимости от условия и не делать дополнительное соединение? Условие на соединение же никак не прописать, насколько я знаю?
   asady
 
1 - 15.12.20 - 17:01
(0) текст запроса формируй программно.
   salvator
 
2 - 15.12.20 - 17:02
(1) Вариант, конечно, но хотелось бы иметь текст запроса, способный открываться в дальнейшем в конструкторе.
   lEvGl
 
3 - 15.12.20 - 17:03
выбор когда это же и есть условие
   mkalimulin
 
4 - 15.12.20 - 17:05
(0) Что значит: не прописать условие на соединение? То, что стоит после ПО и есть нужное тебе условие
   Dmitrii
 
5 - 15.12.20 - 17:06
(0) Можно как-нибудь так.

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| МойСправочник.Код КАК Код,
| МойСправочник.Наименование КАК Наименование,
| ВЫБОР
|  КОГДА &СоединятьСПервымРегистром ТОГДА МойРС.РеквизитРегистра
|  ИНАЧЕ МойВторойРС.РеквизитРегистра
| КОНЕЦ КАК РеквизитРегистра
|ИЗ
| Справочник.МойСправочник КАК МойСправочник
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МойРС КАК МойРС
|   ПО &СоединятьСПервымРегистром И МойСправочник.Ссылка = МойРС.Ключ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МойВторойРС КАК МойВторойРС
|   ПО НЕ &СоединятьСПервымРегистром И МойСправочник.Ссылка = МойВторойРС.Ключ";
Запрос.УстановитьПараметр("СоединятьСПервымРегистром", МоёУсловие);
 


А вообще вариантов может быть несколько, включая программное формирование текста запроса.
   acht
 
6 - 15.12.20 - 17:07
(0) > словие на соединение же никак не прописать
выбрать
выбор когда &флаг1 тогда таблица1.поле иначе таблица2.поле конец
из таблица0
левое соединение таблица1 по &флаг1 и (...)
левое соединение таблица2 по не &флаг1 и (...)
   salvator
 
7 - 15.12.20 - 17:12
(5) Если СоединятьСПервымРегистром = Истина, то фактически в базе данных соединения с "РегистрСведений.МойВторойРС" не будет, я правильно понимаю?
   Dmitrii
 
8 - 15.12.20 - 17:13
Или еще так.
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| МойСправочник.Код КАК Код,
| МойСправочник.Наименование КАК Наименование,
| МойРС.РеквизитРегистра
| КОНЕЦ КАК РеквизитРегистра
|ИЗ
| Справочник.МойСправочник КАК МойСправочник
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МойРС КАК МойРС
|   ПО &СоединятьСПервымРегистром И МойСправочник.Ссылка = МойРС.Ключ";
Если МоёУсловие Тогда
 СтрЗаменить(Запрос.Текст, "РегистрСведений.МойРС", "РегистрСведенй.МойВторойРС");
КонецЕсли;

   Dmitrii
 
9 - 15.12.20 - 17:15
(7) Да. При значении параметра СоединятьСПервымРегистром = Истина условие соединения с таблицей МойВторойРС всегда будет ЛОЖЬ, а это значит, что из таблицы МойВторойРС ни одна запись в результат не попадёт.
   salvator
 
10 - 15.12.20 - 17:19
(9) Не совсем понял, а само соединение, физически, строится или нет? Такая конструкция влияет на производительность?
   Dmitrii
 
11 - 15.12.20 - 17:26
(10) >> Такая конструкция влияет на производительность?

Для достоверности лучше бы конечно проверить, но предположу, что не влияет. Оптимизаторы СУБД достаточно умные, чтобы учесть тот факт, что условие соединения всегда ЛОЖЬ.
Я бы заморачивался с этим вопросом только когда соединяемые таблицы реально огромны. При относительно небольшом количестве записей (сотни тысяч) разница вряд ли будет ощутима.
   salvator
 
12 - 15.12.20 - 17:32
Спасибо большоей!
   youalex
 
13 - 15.12.20 - 17:32
(10) в ms sql было, насколько помню, если условие через переменную, то строится, если через литералы (1=0), то нет.
Как 1С строит запрос в этом случае - надо смотреть.
   salvator
 
14 - 15.12.20 - 17:36
(13) Понятно, спасибо за информацию.
   Малыш Джон
 
15 - 15.12.20 - 17:41
(14) Можно через сделать вариант запроса с соединением с одним РС, а по условию - СтрЗаменить(ТекстЗапроса, КусокЗапросаСоСтарымРС, КусокЗапросаСНовымРС).

И в конструкторе открываться будет,и не будет заморочек с производительностью

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.