Имя: Пароль:
1C
1С v8
Простейший запрос не работает (левое соединение)
0 Dmitriy_
Kolesnikov
 
15.10.12
18:30
ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагент,
   КонтактнаяИнформацияТелефон.Представление КАК Телефон,
   Контрагенты.СпособДоставки
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформацияТелефон
       ПО Контрагенты.Ссылка = КонтактнаяИнформацияТелефон.Объект
ГДЕ
   КонтактнаяИнформацияТелефон.Вид = &ВидКонтактнойИнформацииТелефон
   И Контрагенты.Ссылка = &Контрагент


=============
Контрагент = Сименс
У Сименса в контактной информации нет телефона
Итог = пустая таблица

Почему я не получаю таблицу из одной строки с пустой колонкой "Телефон", а получаю пустую таблицу?
P. S. Если у клиента есть телефон, он попадает в результат запроса.
1 Fragster
 
гуру
15.10.12
18:31
NULL ничему не равен, даже себе
2 fisher
 
15.10.12
18:31
ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагент,
   КонтактнаяИнформацияТелефон.Представление КАК Телефон,
   Контрагенты.СпособДоставки
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформацияТелефон
       ПО Контрагенты.Ссылка = КонтактнаяИнформацияТелефон.Объект И КонтактнаяИнформацияТелефон.Вид = &ВидКонтактнойИнформацииТелефон
ГДЕ Контрагенты.Ссылка = &Контрагент
3 Beduin
 
15.10.12
18:32
(0) Где срабатывате на строчку соединения
4 Dmitriy_
Kolesnikov
 
15.10.12
18:47
(2) благодарю, работает. Но в чём моя ошибка?
5 Fragster
 
гуру
15.10.12
18:53
(4) -> (1)
6 Wobland
 
15.10.12
18:56
подкину на эту тему..
выбрать
выбор когда NULL=NULL тогда истина иначе ложь конец
объединить
выбрать
выбор когда NULL<>NULL тогда истина иначе ложь конец

что будет? объединить тут чисто для наглядности
7 Dmitriy_
Kolesnikov
 
15.10.12
19:06
Что-то я туплю. Где сравнение с NULL?
В школе учат, что ЛЕВОЕ СОЕДИНЕНИЕ выдаст ВСЮ левую таблицу независимо от того, что там справа.

ВЫБРАТЬ Таб1.Поле1,
Таб1.Поле2,
Таб2.Поле3
ИЗ
Таб1
ЛЕВОЕ СОЕДИНЕНИЕ
Таб2 ПО Таб1.Поле1 = Таб2.Поле4

Я получу как минимум всю таб1 независимо от того, есть в таб2 вообще что-нибудь или нет.
8 Wobland
 
15.10.12
19:07
(7) а потом каак долбанёшь по ней ГДЕ ;)
9 Fragster
 
гуру
15.10.12
19:13
(7) сравнение с NULL у тебя прямо после "ГДЕ"
10 Dmitriy_
Kolesnikov
 
15.10.12
19:24
&ВидКонтактнойИнформацииТелефон можно заменить на ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонКонтрагента), так что это не NULL
11 Wobland
 
15.10.12
19:26
кстати, о птичках. как так?

выбрать
сумма(Нечто.ЧтоТо)
из
(выбрать 20 как ЧтоТо
объединить
выбрать NULL) как Нечто

объединить все

выбрать NULL+20


сумма() приравнивает NULLы к 0. это у 1С такой прикол, или так всегда было?
12 Wobland
 
15.10.12
19:26
(10) ГДЕ
   КонтактнаяИнформацияТелефон.Вид = ...
13 Wobland
 
15.10.12
19:27
(11) или уже в отдельную ветку перебраться ;)
14 Lys
 
15.10.12
19:27
(7) Правильно. В результате соединения получишь Таб1.
А уже ПОСЛЕ соединения на этот результат накладывается условие из ГДЕ (см. (8))
Вот это наложение и даст в итоге пустой результат запроса.
15 Dmitriy_
Kolesnikov
 
15.10.12
19:32
(12) ага, я вас наконец понял.
КонтактнаяИнформацияТелефон.Вид  - это NULL
поэтому моё условие ГДЕ КонтактнаяИнформацияТелефон.Вид = чемутотам всегда будет давать ЛОЖЬ
Благодарю за ликбез! Не знал, что в ПО можно вставлять условия.
16 Анцеранана
 
15.10.12
19:41
А по-моему (4) это хрень, не могу обосновать (вроде читал где-то), но даже если правильно как-то некрасиво. предлагаю проверить на Null
КонтактнаяИнформацияТелефон.Вид в (0) и все будет зачепись)))
17 Wobland
 
15.10.12
19:41
(15) я тоже когда-то первый раз узнал, что можно делать СОЕДИНЕНИЕ ПО Истина ;)
18 Wobland
 
15.10.12
19:43
(15) опа! а в (0) ты что вставил тогда в ПО?
19 alexei366
 
15.10.12
23:12
Блин пипец, у тя в запросе условие действует на итоговую таблицу, и соответственно если всё что связанно с отбором по контактной инфе (когда данных по контрагенту нет) сравнивается с NULL. И вообще тебе на уровне кода надо обрабатывать там типо есть строки в итоге или нет, эт какбы правильно
20 Dmitriy_
Kolesnikov
 
24.10.12
15:34
Другой клиент, другая база.
Пишу:

ВЫБРАТЬ РАЗЛИЧНЫЕ
...
Из
   РегистрНакопления.ЗаказыПокупателей КАК Заказы
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЗаказПокупателяТовары.Ссылка КАК Ссылка,
           СУММА(ЗаказПокупателяТовары.Площадь) КАК Площадь,
           СУММА(ЗаказПокупателяТовары.Количество) КАК Количество,
           МАКСИМУМ(ВЫБОР
                   КОГДА ЗаказПокупателяТовары.ррДвойной
                       ТОГДА ЗаказПокупателяТовары.Площадь * 2
                   ИНАЧЕ ЗаказПокупателяТовары.Площадь
               КОНЕЦ) КАК ПлощадьДВ,
           МАКСИМУМ(ВЫБОР
                   КОГДА ЗаказПокупателяТовары.МДФ.ПокрытПлёнкой = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
                       ТОГДА ЛОЖЬ
                   ИНАЧЕ ИСТИНА
               КОНЕЦ) КАК Кашированный
       ИЗ
           Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
       ГДЕ
           ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
       
       СГРУППИРОВАТЬ ПО
           ЗаказПокупателяТовары.Ссылка) КАК ТоварыТаб
       ПО Заказы.ЗаказПокупателя.Ссылка = ТоварыТаб.Ссылка



Итог - связывает ВСЕГДА, независимо от того, ПокрытПлёнкой = истина или ложь.
Где я накосячил?
21 lubja
 
24.10.12
15:38
(20) а у тебя в условии соединения стоит только
ПО Заказы.ЗаказПокупателя.Ссылка = ТоварыТаб.Ссылка
это, раз. а второе в Заказы.ЗаказПокупателя.Ссылка ссылка лишняя, можно просто Заказы.ЗаказПокупателя
22 Dmitriy_
Kolesnikov
 
24.10.12
16:46
Сорри, не дописал

       ПО Заказы.ЗаказПокупателя.Ссылка = ТоварыТаб.Ссылка
           И (ВЫБОР
               КОГДА &ТолькоКашированные
                   ТОГДА ВЫБОР
                           КОГДА ТоварыТаб.Кашированный = ИСТИНА
                               ТОГДА ИСТИНА
                           ИНАЧЕ ЛОЖЬ
                       КОНЕЦ
               ИНАЧЕ ИСТИНА
           КОНЕЦ)
23 Dmitriy_
Kolesnikov
 
24.10.12
17:03
Вот весь запрос. Что Кашированный = истина, что Кашированный = Ложь, что кашированный = NULL - Всё равно в результате имеем все строки.


ВЫБРАТЬ РАЗЛИЧНЫЕ
   ТоварыТаб.Кашированный,
   ВЫБОР
       КОГДА &ТолькоКашированные
           ТОГДА ВЫБОР
                   КОГДА ТоварыТаб.Кашированный = ИСТИНА
                       ТОГДА ИСТИНА
                   ИНАЧЕ ЛОЖЬ
               КОНЕЦ
       ИНАЧЕ ИСТИНА
   КОНЕЦ КАК Условие,
   Заказы.ЗаказПокупателя.Ссылка КАК ЗаказСсылка,
   Заказы.ЗаказПокупателя.Дата КАК ДатаСоздания,
   ТоварыТаб.Площадь,
   ТоварыТаб.Количество
ИЗ
   РегистрНакопления.ЗаказыПокупателей КАК Заказы
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЗаказПокупателяТовары.Ссылка КАК Ссылка,
           СУММА(ЗаказПокупателяТовары.Площадь) КАК Площадь,
           СУММА(ЗаказПокупателяТовары.Количество) КАК Количество,
           МАКСИМУМ(ВЫБОР
                   КОГДА ЗаказПокупателяТовары.МДФ.ПокрытПлёнкой = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
                       ТОГДА ЛОЖЬ
                   ИНАЧЕ ИСТИНА
               КОНЕЦ) КАК Кашированный
       ИЗ
           Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
       ГДЕ
           ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
       
       СГРУППИРОВАТЬ ПО
           ЗаказПокупателяТовары.Ссылка) КАК ТоварыТаб
       ПО Заказы.ЗаказПокупателя.Ссылка = ТоварыТаб.Ссылка
           И (ВЫБОР
               КОГДА &ТолькоКашированные
                   ТОГДА ВЫБОР
                           КОГДА ТоварыТаб.Кашированный ЕСТЬ NULL
                               ТОГДА ЛОЖЬ
                           ИНАЧЕ ИСТИНА
                       КОНЕЦ
               ИНАЧЕ ИСТИНА
           КОНЕЦ)
ГДЕ
   Заказы.ЗаказПокупателя.Дата МЕЖДУ &Дата1 И &Дата2
24 Wobland
 
24.10.12
17:07
>Кашированный
это что-то новенькое..
25 Wobland
 
24.10.12
17:09
а что-то я не понял, в этой Каше (КАК Кашированный) где источник данных?
26 Wobland
 
24.10.12
17:10
(25) плин, это поле так называется
27 Wobland
 
24.10.12
17:13
последнее условие перепиши под
&ТолькоКашированные ИЛИ ТоварыТаб.Кашированный
и в запросе
ЕСТЬNULL(ЗаказПокупателяТовары.МДФ.ПокрытПлёнкой = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка), ЧтоНибудь)
28 Dmitriy_
Kolesnikov
 
24.10.12
17:14
Кашированный - это тот самый хитрый флаг, Если ТолькоКашированный = истина тогда проверяем поле Кашированный во вложенном запросе. Если Кашированный = ложь (при выполнении ф-и Максимум он = NULL), тогда в итоговой таблице этой строки быть не должно.
29 Wobland
 
24.10.12
17:14
(27) в подзапросе выбираешь как есть, в верхнем выбрать разбираешься с нуллом
30 Dmitriy_
Kolesnikov
 
24.10.12
17:15
Кашированный - это тот самый хитрый флаг, Если ТолькоКашированные = истина тогда проверяем поле Кашированный во вложенном запросе. Если Кашированный = ложь (при выполнении ф-и Максимум он = NULL), тогда в итоговой таблице этой строки быть не должно.
31 Wobland
 
24.10.12
17:15
короче, я ни фига не понял, соединять по кашированности не надо, надо пихать это в конечное ГДЕ в виде (27)
32 Dmitriy_
Kolesnikov
 
24.10.12
17:17
ОК, благодарю за совет, попробую.
ПокрытПлёнкой имеет тип СправочникСсылка.Номенклатура.
33 Reset
 
24.10.12
17:18
Млять, я голодный, а вы тут Кашируете
34 Wobland
 
24.10.12
17:19
(32) добейся того, чтобы твой запрос выдавал верное истинное или ложное каширование, а потом колдуй флаг нужности.
подзапрос предлагаю заставить выдавать всё, разбираться с кашами потом ;)
35 Wobland
 
24.10.12
17:20
(33) это от слова кашипировский
36 Wobland
 
24.10.12
17:24
(34) а ведь в таком вот виде остаётся пространство для манёвра оптимизации..
37 rs_trade
 
24.10.12
17:28
(11) она не приравнивает их к 0, она их игнорирует
38 rs_trade
 
24.10.12
17:28
+(37) и не 1с, а субд
39 Wobland
 
24.10.12
17:30
(37) я таки завёл отдельную ветку тогда..
40 Dmitriy_
Kolesnikov
 
25.10.12
00:51
Вот упрощённый запрос. Мне надо, чтобы строки, у которых МДФПокрытПлёнкой не заполнен, не попадали в результат.


ВЫБРАТЬ РАЗЛИЧНЫЕ
   Заказы.ЗаказПокупателя.Ссылка КАК ЗаказСсылка,
   Заказы.ЗаказПокупателя.Дата КАК ДатаСоздания,
   ТоварыТаб.Площадь,
   ТоварыТаб.Количество,
   ТоварыТаб.МДФПокрытПлёнкой
ИЗ
   РегистрНакопления.ЗаказыПокупателей КАК Заказы
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЗаказПокупателяТовары.Ссылка КАК Ссылка,
           СУММА(ЗаказПокупателяТовары.Площадь) КАК Площадь,
           СУММА(ЗаказПокупателяТовары.Количество) КАК Количество,
           МАКСИМУМ(ЗаказПокупателяТовары.МДФ.ПокрытПлёнкой) КАК МДФПокрытПлёнкой
       ИЗ
           Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
       ГДЕ
           ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
       СГРУППИРОВАТЬ ПО
           ЗаказПокупателяТовары.Ссылка) КАК ТоварыТаб
       ПО Заказы.ЗаказПокупателя.Ссылка = ТоварыТаб.Ссылка
           И ((НЕ ТоварыТаб.МДФПокрытПлёнкой ЕСТЬ NULL ))
           //И (ТоварыТаб.МДФПокрытПлёнкой <> Значение(Справочник.Номенклатура.ПустаяСсылка))
ГДЕ
   Заказы.ЗаказПокупателя.Дата МЕЖДУ &Дата1 И &Дата2
41 Dmitriy_
Kolesnikov
 
25.10.12
00:54
P. S. Таблицы Заказы и ТоварыТаб обязательно должны соединяться левым соединением.
42 Dmitriy_
Kolesnikov
 
25.10.12
01:08
Всё, разобрался. Не надо было мудрствовать. Просто прописать условие в блок условий.



ВЫБРАТЬ РАЗЛИЧНЫЕ
   Заказы.ЗаказПокупателя.Ссылка КАК ЗаказСсылка,
   Заказы.ЗаказПокупателя.Дата КАК ДатаСоздания,
   ТоварыТаб.Площадь,
   ТоварыТаб.Количество,
   ТоварыТаб.МДФПокрытПлёнкой
ИЗ
   РегистрНакопления.ЗаказыПокупателей КАК Заказы
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЗаказПокупателяТовары.Ссылка КАК Ссылка,
           СУММА(ЗаказПокупателяТовары.Площадь) КАК Площадь,
           СУММА(ЗаказПокупателяТовары.Количество) КАК Количество,
           МАКСИМУМ(ВЫБОР
                   КОГДА ЗаказПокупателяТовары.МДФ.ПокрытПлёнкой = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
                       ТОГДА -1
                   ИНАЧЕ 1
               КОНЕЦ) КАК МДФПокрытПлёнкой
       ИЗ
           Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
       ГДЕ
           ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
       СГРУППИРОВАТЬ ПО
           ЗаказПокупателяТовары.Ссылка) КАК ТоварыТаб
       ПО Заказы.ЗаказПокупателя.Ссылка = ТоварыТаб.Ссылка
ГДЕ
   Заказы.ЗаказПокупателя.Дата МЕЖДУ &Дата1 И &Дата2
   И ТоварыТаб.МДФПокрытПлёнкой >= 0
43 Boleev v2
 
25.10.12
01:40
мдя..во развели