Имя: Пароль:
1C
1С v8
Условие в запросе на таблицу из левого соединения.
, ,
0 nikast
 
15.05.18
12:22
Всем привет, пишу простецкий запрос в 1с и у меня слегка вспухла голова:
Есть остатки бонусов в регистре накопления: ПодарочныеБонусыОстатки,
и есть контактная информация в регистре сведений: РегистрСведений.КонтактнаяИнформация.
Хочу объединить данные запросом...
Запрос.Текст = "ВЫБРАТЬ
|ПодарочныеБонусыОстатки.ВладелецДисконтнойКарты КАК Владелец,
|ПодарочныеБонусыОстатки.ДисконтнаяКарта КАК Карта,
|ПодарочныеБонусыОстатки.СуммаПодарочногоБонусаОстаток КАК Остаток,
|КонтактнаяИнформация.Поле3 КАК Телефон
|ИЗ
|РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПодарочныеБонусы.Остатки КАК ПодарочныеБонусыОстатки
|ПО КонтактнаяИнформация.Объект = ПодарочныеБонусыОстатки.ВладелецДисконтнойКарты
|ГДЕ
|КонтактнаяИнформация.Тип = &Тип";

В остатках есть 3 записи одна из которых отсутствует в в РЕГИСТРЕ СВЕДЕНИЙ. Соответственно если я выполняю Inner join то у меня на выходе 2 записи. А если выполню left join то на выходе должно быть 3 записи одна из которых со значем конт. информации null. Но left повторяет выборку inner, подскажите почему. Спасибо.
1 Волшебник
 
15.05.18
12:23
Попробуй ПРАВОЕ СОЕДИНЕНИЕ
2 Ненавижу 1С
 
гуру
15.05.18
12:23
(0) потому что ЛЕВОЕ превращается во ВНУТРЕННЕЕ при таком условии
ГДЕ

перенеси условие ГДЕ в условие ПО левого соединения
3 nikast
 
15.05.18
12:31
Запрос.Текст = "ВЫБРАТЬ
                       |    ПодарочныеБонусыОстатки.ВладелецДисконтнойКарты КАК Владелец,
                       |    ПодарочныеБонусыОстатки.ДисконтнаяКарта КАК Карта,
                       |    ПодарочныеБонусыОстатки.СуммаПодарочногоБонусаОстаток КАК Остаток,
                       |    КонтактнаяИнформация.Поле3
                       |ИЗ
                       |    РегистрНакопления.ПодарочныеБонусы.Остатки КАК ПодарочныеБонусыОстатки
                       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
                       |        ПО ПодарочныеБонусыОстатки.ВладелецДисконтнойКарты = КонтактнаяИнформация.Объект";
4 catena
 
15.05.18
12:32
"должно быть 3 записи одна из которых со значем конт. информации null. "

Так ты ж ее отрезал.

|ГДЕ
|КонтактнаяИнформация.Тип = &Тип";
5 novichok79
 
15.05.18
12:33
я бы делал как-то так

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    ПодарочныеБонусы.ДисконтнаяКарта КАК ДисконтнаяКарта,
|    ПодарочныеБонусы.ВладелецДисконтнойКарты КАК ВладелецДисконтнойКарты,
|    ПодарочныеБонусы.СуммаПодарочногоБонусаОстаток КАК Сумма
|ПОМЕСТИТЬ ПодарочныеБонусы
|ИЗ
|    РегистрНакопления.ПодарочныеБонусы.Остатки КАК ПодарочныеБонусы
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    КонтактнаяИнформация.Объект КАК Объект,
|    КонтактнаяИнформация.Представление КАК Представление
|ПОМЕСТИТЬ КонтактнаяИнформация
|ИЗ
|    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            ПодарочныеБонусы.ВладелецДисконтнойКарты КАК ВладелецДисконтнойКарты
|        ИЗ
|            ПодарочныеБонусы КАК ПодарочныеБонусы) КАК ПодарочныеБонусы
|        ПО КонтактнаяИнформация.Объект = ПодарочныеБонусы.ВладелецДисконтнойКарты
|            И (КонтактнаяИнформация.Вид = &Телефон)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ПодарочныеБонусы.ДисконтнаяКарта КАК ДисконтнаяКарта,
|    ПодарочныеБонусы.ВладелецДисконтнойКарты КАК ВладелецДисконтнойКарты,
|    ПодарочныеБонусы.Сумма КАК Сумма,
|    ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Телефон
|ИЗ
|    ПодарочныеБонусы КАК ПодарочныеБонусы
|        ЛЕВОЕ СОЕДИНЕНИЕ КонтактнаяИнформация КАК КонтактнаяИнформация
|        ПО ПодарочныеБонусы.ВладелецДисконтнойКарты = КонтактнаяИнформация.Объект
|
|УПОРЯДОЧИТЬ ПО
|    ВладелецДисконтнойКарты
|АВТОУПОРЯДОЧИВАНИЕ";
6 novichok79
 
15.05.18
12:34
(0) стаж: 6 лет, oh really?
8 mehfk
 
15.05.18
12:38
(7) И правила форума тоже не видел.
9 novichok79
 
15.05.18
12:39
(7) ясно тогда. язык запросов 1С - это русскоязычный SQL без INSERT и UPDATE.
10 nikast
 
15.05.18
12:39
Когда убираю Где, то выводится
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон)
Но стали выводится все типы контактной информации =)
11 novichok79
 
15.05.18
12:40
(10) попробуй код из (5)
я уверен, у тебя получится
12 фросия
 
15.05.18
12:40
(10) см (2) : перенеси условие ГДЕ в условие ПО левого соединения
13 фросия
 
15.05.18
12:41
Запрос.Текст = "ВЫБРАТЬ
|ПодарочныеБонусыОстатки.ВладелецДисконтнойКарты КАК Владелец,
|ПодарочныеБонусыОстатки.ДисконтнаяКарта КАК Карта,
|ПодарочныеБонусыОстатки.СуммаПодарочногоБонусаОстаток КАК Остаток,
|КонтактнаяИнформация.Поле3 КАК Телефон
|ИЗ
|РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПодарочныеБонусы.Остатки КАК ПодарочныеБонусыОстатки
|ПО КонтактнаяИнформация.Объект = ПодарочныеБонусыОстатки.ВладелецДисконтнойКарты
| И
|КонтактнаяИнформация.Тип = &Тип";
14 фросия
 
15.05.18
12:41
Запрос.Текст = "ВЫБРАТЬ
|ПодарочныеБонусыОстатки.ВладелецДисконтнойКарты КАК Владелец,
|ПодарочныеБонусыОстатки.ДисконтнаяКарта КАК Карта,
|ПодарочныеБонусыОстатки.СуммаПодарочногоБонусаОстаток КАК Остаток,
|КонтактнаяИнформация.Поле3 КАК Телефон
|ИЗ
РегистрНакопления.ПодарочныеБонусы.Остатки КАК ПодарочныеБонусыОстатки
|ЛЕВОЕ СОЕДИНЕНИЕ
|РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация

|ПО КонтактнаяИнформация.Объект = ПодарочныеБонусыОстатки.ВладелецДисконтнойКарты
| И
|КонтактнаяИнформация.Тип = &Тип";
15 nikast
 
15.05.18
12:41
Друзья, всем спасибо за ответы.
16 фросия
 
15.05.18
12:42
как-то так
17 novichok79
 
15.05.18
12:43
а вот по-моему джойнить виртуальные таблицы друг с другом вызывают подвис оптимизатора плана запроса в postgresql, у меня бывало такое. поэтому рекомендуется все сначала во временные таблицы вставить, а потом соединять.
18 catena
 
15.05.18
12:49
(7)Ну вы, конечно, замарались по необходимости богомерзким 1С, только вот ошибка в (0) с 1С никак не связана, не может быть NULL равен какому-либо типу даже в православном SQL.
19 kabanoff
 
15.05.18
12:53
(17) Не только друг с другом и не только на постгри. Их джойнить в принципе не рекомендуется, потому что на СУБД это преобразуется во вложенный запрос, а по вложенному запросу оптимизатор может построить неоптимальный план, т.к. ему сложно угадать размер выборки.

(0) Чтобы подсказать оптимальное решение, нужно начать с описания задачи. Судя по тексту запроса, остаток выведется только при наличии телефона, причем остаток по карте будет задублирован на количество номеров телефона владельца.
20 nikast
 
15.05.18
13:00
(19) (18) Согласен.
Парни, все получилось. Спасибо.
21 novichok79
 
15.05.18
13:01
это я говорил по поводу кода из (13) и (14)
22 фросия
 
15.05.18
13:02
(21) я не парень
23 novichok79
 
15.05.18
13:03
(22) и это хорошо.
24 фросия
 
15.05.18
13:04
(21) это запрос для наглядности куда засунуть условия что б получилось то что надо автору.
про оптимизацию - верю вам.
25 фросия
 
15.05.18
13:04
(20)  и (18) тоже не парень
26 novichok79
 
15.05.18
13:06
(25) сколько прекрасных коллег собралось в одной теме.
27 Мимохожий Однако
 
15.05.18
13:09
(25) Казахстан рулит
28 nikast
 
15.05.18
13:13
И девушкам тоже спасибо =))))
Программист всегда исправляет последнюю ошибку.