Имя: Пароль:
1C
1С v8
Поля соединения в запросе от условия
0 Анастасия_85
 
08.02.13
16:56
Доброго времени суток.

Подскажите пожалуйста, как сделать в запросе поля соединения в зависимости от некоторого условия. Понимаю, что вопрос легкий, но что-то не могу сама сообразить.
Нужно чтобы было так:
если нету проживающих собственников - тогда отображаются собственники
Запрос:
//таб проживающие
   |    ТабПроживающие.ЛицевойСчет КАК ЛСПроживаю,
   |    ТабПроживающие.Проживающий КАК Проживающий
   //таб собственники
   |    Собственники.Собственник,
   |    Собственники.ЛицевойСчет КАК ЛССобвст,
|ИЗ
   |    ИСК КАК ТабИск
   |        ЛЕВОЕ СОЕДИНЕНИЕ ТабПроживающие КАК ТабПроживающие
   |        ПО ТабИск.ЛицевойСчет = ТабПроживающие.ЛицевойСчет
   |        ЛЕВОЕ СОЕДИНЕНИЕ Собственники КАК Собственники
   |        ПО (Собственники.ЛицевойСчет = ТабИск.ЛицевойСчет
   |        И Собственники.Собственник = ТабПроживающие.Проживающий
   |        ИЛИ Собственники.Контрагент = ТабПроживающие.Проживающий
   |        ИЛИ Собственники.Физлицо = ТабПроживающие.Проживающий)


Благодарю за помощь.
1 m-serg74
 
08.02.13
17:07
ISNULL(ТабПроживающие.Проживающий, Собственники.Собственник) КАК Проживающий
2 m-serg74
 
08.02.13
17:10
только там что то условия соединения какие то "мутные" вроде
3 Анастасия_85
 
08.02.13
17:17
m-serg74, спасибо, все работает

ПО (Собственники.ЛицевойСчет = ТабИск.ЛицевойСчет
-главное условие  

остальные условия:
т.к. собственник может быть либо из справочника физические лица, либо из справочника- контрагенты, в котором есть поле ссылка на физ. лица
как сделать условие, в зависимости от типа данных -тоже оставался вопрос, пока что не решенный
4 sapphire
 
08.02.13
17:21
(3) Вообще и то, и другое собираешь неправильно, ИМХО
Опиши задачу более внятно:
Есть таблица Иск с полем лицевой счет,
нужно получить проживающих по данному лицевому счету?
или еще флаг, что проживающий еще и является собственником?
5 m-serg74
 
08.02.13
17:22
(3)
выбор
когда Собственник Ссылка справочник.физическиеЛица
  тогда Собственники.Физлицо = ТабПроживающие.Проживающий
когда Собственник Ссылка справочник.Контрагенты
  тогда Собственники.Контрагент = ТабПроживающие.Проживающий
иначе
  Собственники.Собственник = ТабПроживающие.Проживающий
конец
6 sapphire
 
08.02.13
17:23
(5) Гадание на кофейной гуще или "Угадай мелодию"?
7 Анастасия_85
 
08.02.13
17:24
sapphire,
Есть таб. иск
Нужно получить и собственников, и проживающих
т.е. проживающий может и не быть собственником и собственник может и не проживать
8 m-serg74
 
08.02.13
17:24
(6) на фиг мне за нее гадать? я направление показал дальше самой думать.. и удачи
9 Анастасия_85
 
08.02.13
17:25
m-serg74, спасибо за направление.
10 m-serg74
 
08.02.13
17:26
пжл
11 Анастасия_85
 
08.02.13
17:31
m-serg74, извините, не досмотрела
нет проживающих вообще- и есть 1 собственник
в поле собственник нет ничего
12 m-serg74
 
08.02.13
17:36
(11) значит по этому условию не проходит

   |        ЛЕВОЕ СОЕДИНЕНИЕ Собственники КАК Собственники
   |        ПО (Собственники.ЛицевойСчет = ТабИск.ЛицевойСчет
   |        И Собственники.Собственник = ТабПроживающие.Проживающий
13 Анастасия_85
 
08.02.13
17:39
m-serg74,
только по этому услович, т.к. соединения по л/с- подходит
И Собственники.Собственник = ТабПроживающие.Проживающий
14 hhhh
 
08.02.13
17:41
(13) почитайте (11) повнимательнее, проживающих нет.
15 m-serg74
 
08.02.13
17:41
(13) [т.к. соединения по л/с- подходит }
если оно подходит для л\с Собственники.ЛицевойСчет
и
Собственники.Собственник = ТабПроживающие.Проживающий
почему
тогда
ТабИск.ЛицевойСчет <> ТабПроживающие.ЛицевойСчет
16 m-serg74
 
08.02.13
17:45
+ к (2) про мутные условия
   |        ЛЕВОЕ СОЕДИНЕНИЕ Собственники КАК Собственники
   |        ПО (Собственники.ЛицевойСчет = ТабИск.ЛицевойСчет
   |        И Собственники.Собственник = ТабПроживающие.Проживающий
   |        ИЛИ Собственники.Контрагент = ТабПроживающие.Проживающий
   |        ИЛИ Собственники.Физлицо = ТабПроживающие.Проживающий)

Собственников соединяете с ТабИск и ТабПроживающие одновременно... ИМХО что то тут лажа
17 Анастасия_85
 
08.02.13
17:57
сейчас к сожалению не могу воспроизвести эту ситуацию, но бывает и так, что к примеру проживающий =собственнику, но разные справочники- и поэтому 1 и тот же человек дублируется
18 sapphire
 
08.02.13
18:02
Объединить сначала собственников и проживающих через union с фильтром по л/с потом агрегировать флаги собственник, проживающий.
19 hhhh
 
08.02.13
18:02
(17) и поэтому вы полностью отрубили собственников? Чтобы они вообще никогда не появились.

Как Сталин говорил: кто такой Синявский, футбольный комментатор? - Нет, это другой, писатель. - А зачем нам два Синявских?
20 sapphire
 
08.02.13
18:02
(17) Типы должны совпадать
21 sapphire
 
08.02.13
18:03
+(20) т.е нужно явное соединение с таблицей, например, контрагенты, что бы получить ф/л собственника.
22 sapphire
 
08.02.13
18:12
////таб проживающие
//
//    |    ТабПроживающие.ЛицевойСчет КАК ЛСПроживаю,
//    |    ТабПроживающие.Проживающий КАК Проживающий
//    //таб собственники
//
//    |    Собственники.Собственник,
//    |    Собственники.ЛицевойСчет КАК ЛССобвст,
//|ИЗ
//    |    ИСК КАК ТабИск
//    |        ЛЕВОЕ СОЕДИНЕНИЕ ТабПроживающие КАК ТабПроживающие
//    |        ПО ТабИск.ЛицевойСчет = ТабПроживающие.ЛицевойСчет
//    |        ЛЕВОЕ СОЕДИНЕНИЕ Собственники КАК Собственники
//    |        ПО (Собственники.ЛицевойСчет = ТабИск.ЛицевойСчет
//    |        И Собственники.Собственник = ТабПроживающие.Проживающий
//    |        ИЛИ Собственники.Контрагент = ТабПроживающие.Проживающий
//    |        ИЛИ Собственники.Физлицо = ТабПроживающие.Проживающий)
//    

//----------- ПОПЫТКА УГАДАТЬ ПОЛЯ И НАЗВАНИЯ ---------------

SELECT
    ПроживающиеИСобственники.ЛицевойСчет
   ,ПроживающиеИСобственники.ФизЛицо
   ,MAX(ПроживающиеИСобственники.Проживающий) Проживающий
   ,MAX(ПроживающиеИСобственники.Собственник) Собственник
FROM
(
SELECT
    Иск.ЛицевойСчет
   ,ТабПроживающие.Проживающий ФизЛицо
   ,Истина Проживающий
   ,ЛОЖЬ Собственник
FROM
   Иск
INNER JOIN    ТабПроживающие
ON  Иск.ЛицевойСчет = ТабПроживающие.ЛицевойСчет    
UNION ALL
SELECT
    Иск.ЛицевойСчет
   ,Собственники.Собственник ФизЛицо
   ,ЛОЖЬ Проживающий
   ,Истина Собственник
FROM
   Иск
INNER JOIN    Собственники
ON  Иск.ЛицевойСчет = Собственники.ЛицевойСчет    

INNER JOIN    Справочник.ФизическиеЛица  СправочникФизическиеЛица
ON  СправочникФизическиеЛица.Ссылка = Собственники.Собственник

UNION // Здесь не надо ALL
SELECT
    Иск.ЛицевойСчет
   ,СправочникКонтрагенты.ФизЛицо
   ,ЛОЖЬ Проживающий
   ,Истина Собственник
FROM
   Иск
INNER JOIN    Собственники
ON  Иск.ЛицевойСчет = Собственники.ЛицевойСчет    

INNER JOIN    Справочник.Контрагенты  СправочникКонтрагенты
ON  СправочникКонтрагенты.Ссылка = Собственники.Собственник
) ПроживающиеИСобственники    
GROUP BY
    ПроживающиеИСобственники.ЛицевойСчет
   ,ПроживающиеИСобственники.ФизЛицо
23 sapphire
 
08.02.13
18:14
в общем идея, высказанная в (18) изложена в (22).
24 sapphire
 
08.02.13
18:15
Подход в (22) лучше (0) хотя бы только тем, что отсутствуют левые соединения.
25 Анастасия_85
 
08.02.13
18:30
sapphire, благодарю Вас за код.
т.е мы проверяем, является ли человек собственником или проживающим, и уже дальше обрабатываю результат от полученных значений
уже дома посмотрю и осмыслю Ваш код