Имя: Пароль:
1C
1С v8
Вложенный запрос
0 PiotrLoginov
 
11.11.12
18:24
Не уверен, что правильно использую терминологию... В УТ 11 есть справочник Партнеры (с иерархией элементов), элементы которого могут быть распределены по сегментам, согласно записям регистра сведений ПартнерыСегмента, каждый элемент которого указывает, какой партнер к какому сегменту относится.

Мне надо написать запрос, отбирающий тех партнеров, чьи родители относятся к определенному сегменту. Начал так:


ВЫБРАТЬ
   Партнеры.Ссылка
ИЗ
   Справочник.Партнеры КАК Партнеры
ГДЕ
   Партнеры.Родитель = &Родитель

Потом отдельно написал выбор такого родителя, для которого есть запись в регистре сведений:

ВЫБРАТЬ
   Партнеры.Ссылка
ИЗ
   Справочник.Партнеры КАК Партнеры
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПартнерыСегмента КАК ПартнерыСегмента
       ПО ПартнерыСегмента.Партнер = Партнеры.Ссылка
ГДЕ
   ПартнерыСегмента.Сегмент.Ссылка = &Ссылка


Вопрос: как теперь указать, что Родитель в первом запросе - это Партнеры.Ссылка во втором? Мне надо объединить эти два запроса в один, после чего указав значение параметра &Ссылка я смогу получать список партнеров, принадлежащих определенному сегменту.
1 PiotrLoginov
 
11.11.12
19:02
Дайте хоть что-нибудь... пример аналогичного запроса, ссылку на информацию по теме...
2 PiotrLoginov
 
11.11.12
19:19
Получилось:

ВЫБРАТЬ
   Партнеры.Ссылка
ИЗ
   Справочник.Партнеры КАК Партнеры
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           Партнеры.Ссылка КАК Ссылка
       ИЗ
           Справочник.Партнеры КАК Партнеры
               ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПартнерыСегмента КАК ПартнерыСегмента
               ПО ПартнерыСегмента.Партнер = Партнеры.Ссылка
       ГДЕ
           ПартнерыСегмента.Сегмент.Ссылка = &Ссылка) КАК ВложенныйЗапрос
       ПО Партнеры.Родитель = ВложенныйЗапрос.Ссылка


Жаль, что на мисте так плохо с помощью новичкам...
3 Chai Nic
 
11.11.12
19:20
(2) Так ведь получилось же! Задача выполнена)
4 fimanich
 
11.11.12
19:31
(2) кстати лучше вместо вложенного запроса использовать временную таблицу. Кроме того, во вложенном запросе мне кажется смело можно даже поставить Внутреннее соединение. Кстати, судя по логике описанной в (0), в основном запросе тоже внутреннее соединение.
5 PiotrLoginov
 
11.11.12
21:49
(4) Знать бы еще, что за "Внутреннее соединение" :)
Так никто и не посоветовал, что можно почитать.

Получившийся запрос нуждался в корректировке. В итоге стало вот так:

ВЫБРАТЬ
   Партнеры.Ссылка КАК Объект,
   Партнеры.Родитель
ИЗ
   (ВЫБРАТЬ
       Партнеры.Ссылка КАК Ссылка,
       ПартнерыСегмента.Сегмент.Ссылка КАК СегментСсылка
   ИЗ
       Справочник.Партнеры КАК Партнеры
           ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПартнерыСегмента КАК ПартнерыСегмента
           ПО ПартнерыСегмента.Партнер = Партнеры.Ссылка
   ГДЕ
       ПартнерыСегмента.Сегмент.Ссылка = &Ссылка) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
       ПО ВложенныйЗапрос.Ссылка = Партнеры.Родитель
6 fimanich
 
12.11.12
08:30
(4) ну здесь мат. часть подучить надо. Внутреннее - когда попадают только записи из обеих таблиц, для которых исполняется условие соединения; левое - когда из левой таблицы попадают все записи, а из правой -  только удовлетворяющие условию соединения.
7 fimanich
 
12.11.12
08:57
(4) кстати, почитать можно даже во встроенной справке: Справка\Встроенный язык\Работа с запросами\Синтаксис текста запросов
8 PiotrLoginov
 
12.11.12
09:38
(6) Ух ты, классно было бы. А то у меня бывают ситуации, когда все записи из левой таблицы не нужны. Действительно, нужны только те, которые удовлетворяют условиям соединения. Сейчас погуглю по видам соединения...
9 Godofsin
 
12.11.12
09:43
(8) Справка есть как бэ... и ЖКК
10 PiotrLoginov
 
12.11.12
09:46
да. получается. В конструкторе на закладке Связи снимаем галочки "Все" у обеих таблиц - и в запросе соединение становится внутренним.
Основная теорема систематики: Новые системы плодят новые проблемы.