Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Условие в запросе на таблицу из левого соединения.

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

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

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

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

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    ПодарочныеБонусы.ДисконтнаяКарта КАК ДисконтнаяКарта,
|    ПодарочныеБонусы.ВладелецДисконтнойКарты КАК ВладелецДисконтнойКарты,
|    ПодарочныеБонусы.СуммаПодарочногоБонусаОстаток КАК Сумма
|ПОМЕСТИТЬ ПодарочныеБонусы
|ИЗ
|    РегистрНакопления.ПодарочныеБонусы.Остатки КАК ПодарочныеБонусы
|;
|
////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    КонтактнаяИнформация.Объект КАК Объект,
|    КонтактнаяИнформация.Представление КАК Представление
|ПОМЕСТИТЬ КонтактнаяИнформация
|ИЗ
|    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            ПодарочныеБонусы.ВладелецДисконтнойКарты КАК ВладелецДисконтнойКарты
|        ИЗ
|            ПодарочныеБонусы КАК ПодарочныеБонусы) КАК ПодарочныеБонусы
|        ПО КонтактнаяИнформация.Объект = ПодарочныеБонусы.ВладелецДисконтнойКарты
|            И (КонтактнаяИнформация.Вид = &Телефон)
|;
|
////////////////////////////////////////////////////////////////////////////////

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

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

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


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