Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вопрос про запрос.

Вопрос про запрос.
Я
   Target1025
 
14.05.20 - 10:42
"ВЫБРАТЬ
    |    ТребованиеНакладная.Номер КАК Номер,
    |    ЗначенияСвойствОбъектов.Значение КАК Значение
    |ИЗ
    |    Документ.ТребованиеНакладная КАК ТребованиеНакладная,
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ТребованиеНакладная.Ссылка = &ТН
    |    И ЗначенияСвойствОбъектов.Объект = &ТН
    |    И ЗначенияСвойствОбъектов.Свойство = &Причина";
    
    Запрос.УстановитьПараметр("ТН",ТН);
    Запрос.УстановитьПараметр("Причина",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Причина",Истина));
    ТЗ= Запрос.Выполнить().Выгрузить();

Пусть у меня такой упрощенный запрос. ПО замыслу, он должен вытащить номер Требования-накладной из ссылки на документ, и, если есть, значение допреквизита из РегистраСведений. Я рассчитывал, что если записи в РС нет, то там будет NULL, но запись ТН тоже не выбирается вообще.
   NecroDog
 
1 - 14.05.20 - 10:48
Таблица регистра должна присоединяться левым соединением к таблице документа
   Target1025
 
2 - 14.05.20 - 10:50
(1) Так?

    "ВЫБРАТЬ
    |    ТребованиеНакладная.Номер КАК Номер,
    |    ЗначенияСвойствОбъектов.Значение КАК Значение
    |ИЗ
    |    Документ.ТребованиеНакладная КАК ТребованиеНакладная
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |        ПО ТребованиеНакладная.Ссылка = ЗначенияСвойствОбъектов.Объект
    |ГДЕ
    |    ТребованиеНакладная.Ссылка = &ТН
    |    И ЗначенияСвойствОбъектов.Объект = &ТН
    |    И ЗначенияСвойствОбъектов.Свойство = &Причина";
   RomanYS
 
3 - 14.05.20 - 10:52
(2) все условия на правую таблицу убрать из "где" и перенсти в условия соединения
   Target1025
 
4 - 14.05.20 - 10:53
(1) К сожалению, так почему-то не работает тоже: если нет записи регистра по этому документу, то выборка пустая.
   polosov
 
5 - 14.05.20 - 10:53
"ВЫБРАТЬ
    |    ТребованиеНакладная.Номер КАК Номер,
    |    ЕстьNULL(ЗначенияСвойствОбъектов.Значение, "Что-то там не то" КАК Значение
    |ИЗ
    |    Документ.ТребованиеНакладная КАК ТребованиеНакладная
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ПО
    |   ТребованиеНакладная.Ссылка = ЗначенияСвойствОбъектов.Объект 
    |   И ЗначенияСвойствОбъектов.Свойство = &Причина"
   Target1025
 
6 - 14.05.20 - 11:13
(3)(4)так заработало! можно теперь пояснить смысл действа "идеологически"? Почему не работало ранее и заработало сейчас?
   Timon1405
 
7 - 14.05.20 - 11:18
   Evgenchik
 
8 - 14.05.20 - 11:27
Накладывая условие через секцию ГДЕ на таблицу соединенную левым соединением, ты превращаешь его во внутреннее соединение. То есть сначала соединил, потом наложил условие ГДЕ. И в результате у тебя нет вообще строк в результате, так как нет строк в РС.
Второй вариант - ты говоришь, что номер из документа мы берем обязательно, а вот данные из РС подтянуться только при наличии отборов из соединения.
   Target1025
 
9 - 14.05.20 - 12:24
(8) Посмотрел, подумал, считаю что дело несколько в ином. Секция ГДЕ делает ПОСТ-обработку получившейся таблицы, выкидывая все строки, не подошедшие под условние ГДЕ. Поэтому и вылетали из выборки пустые записи из РС. А так как иных и не было, выборка получалась пустая.
Т.е., вот этот запрос тоже отрабатывает идеально:

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

В том смысле, что пост-условие ГДЕ он не превращает во внутреннее соединение соединение таблицы. Она по прежнему соединяется левым соединением, и там есть запись Null при отсутствии записи в регистре сведений.
   Timon1405
 
10 - 14.05.20 - 14:45
видимо в (8) "Накладывая условие через секцию ГДЕ на таблицу" следует читать как
"Накладывая условие через секцию ГДЕ на поля присоединяемой таблицы"
   NecroDog
 
11 - 14.05.20 - 16:14
Есть порядок обработки инструкции SELECT. Он вот такой:
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE или WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY

Инструкция AND в соединении выполняется до JOIN. Инструкция WHERE применяется к таблице, получившейся после JOIN.
Этот же порядок дает ответ на возможный вопрос, почему в ORDER BY нужно использовать псевдонимы из SELECT, а в WHERE эти же псевдонимы использовать еще нельзя.

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