|
Условие в запросе на таблицу из левого соединения. | ☑ | ||
---|---|---|---|---|
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
|
И девушкам тоже спасибо =))))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |