Поиск по этому блогу

13 февраля 2013 г.

Коррелированные запросы в 1C8.

 1С не поддерживает коррелированных запросов, то есть обращения из вложенного запроса к полям родительского запроса, кроме варианта с условием "В", пример есть в файле V8adddoc807.htm, приведен ниже. 

===ПРИМЕР ИЗ ФАЙЛА V8adddoc807.htm===
Заметим, что из запроса операции В возможно обращение к полям таблиц, которые встречались во внешнем запросе до появления операции.


Пример:

// Выбрать названия товаров, которые присутствовали в расходных накладных
ВЫБРАТЬ
Товары.Наименование
ИЗ
Справочник.Товары КАК Товары
ГДЕ
      Товары.Ссылка В
      (ВЫБРАТЬ
            РасхНаклСостав.Товар
       ИЗ
            Документ.РасхНакл.Состав КАК РасхНаклСостав
       ГДЕ
           РасхНаклСостав.Товар = Товары.Ссылка
      )
===КОНЕЦ ПРИМЕРА ИЗ ФАЙЛА V8adddoc807.htm===


Еще примеры использования коррелированных запросов:
Задача:
Как получить последние два курса по валютам?

1)Вариант с коррелированным запросом в соединении 
ВЫБРАТЬ
         КурсыВалютСрезПоследних.Валюта,
         КурсыВалютСрезПоследних.Период КАК ПоследняяДата,
         КурсыВалют.Период КАК ПредпоследняяДата,
         КурсыВалютСрезПоследних.Курс КАК ПоследнийКурс,
         КурсыВалют.Курс КАК ПредпоследнийКурс
ИЗ
       РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ((КурсыВалют.Валюта, КурсыВалют.Период) В
            (ВЫБРАТЬ
                      КурсыВалют.Валюта,
                      МАКСИМУМ(КурсыВалют.Период) КАК Период
              ИЗ
                      РегистрСведений.КурсыВалют КАК КурсыВалют
              ГДЕ
              КурсыВалют.Период < КурсыВалютСрезПоследних.Период
              И КурсыВалют.Валюта = КурсыВалютСрезПоследних.Валюта
              СГРУППИРОВАТЬ ПО
              КурсыВалют.Валюта))



2)Самый элегантный вариант - коррелированным подзапросом с ВЫБРАТЬ ПЕРВЫЕ 2
                          

ВЫБРАТЬ
    ТаблицаРегистра.Период,
    ТаблицаРегистра.Валюта,
    ТаблицаРегистра.Курс
ИЗ
    РегистрСведений.КурсыВалют КАК ТаблицаРегистра
ГДЕ
    (ТаблицаРегистра.Валюта, ТаблицаРегистра.Период) В
            (ВЫБРАТЬ ПЕРВЫЕ 2
                КурсыВалют.Валюта,
                КурсыВалют.Период КАК Период
            ИЗ
                РегистрСведений.КурсыВалют КАК КурсыВалют
            ГДЕ
                КурсыВалют.Валюта = ТаблицаРегистра.Валюта
            УПОРЯДОЧИТЬ ПО
                Период УБЫВ) 


5 комментариев:

  1. Последний пример не работает:
    "Недопустимо использовать упорядочивание внутри запроса, вложенного в операцию В с множественными операндами, если есть обращения к полям внешнего запроса
    КурсыВалют.Валюта = <>ТаблицаРегистра.Валюта"

    ОтветитьУдалить
  2. Да и вообще описан вложенный запрос. Он хоть и воспроизводит тоже самое , но с точки зрения СУБД - это разные запросы, а соответственно оптимизатор не участвует, кеш оф, оптимизатор в контесте запроса оф, ну и левая статисика.

    ОтветитьУдалить
  3. Почему автор отзыва "Unknown", почините ))

    ОтветитьУдалить
  4. С коррелированными запросами нужно быть аккуратнее. Помимо падения производительности, подзапрос в соединении вида "ВЫБРАТЬ ПЕРВЫЕ 1" из некоторых таблиц может возвращать разные данные. Т.е. ожидаешь одну строку, к примеру, 1-й документ указанного контрагента, а запрос возвращает этак пяток. С временными таблицами и регистрами сведений худо-бедно это работает, а вот с документами лучше через тета-соединение делать.

    ОтветитьУдалить
  5. Я настійно рекомендую послуги з фінансування «Ле-меридіана» будь-якій людині, яка потребує фінансової допомоги, і вони будуть тримати вас в курсі високих каталогів для будь-яких подальших потреб. В черговий раз вітаю себе та ваших співробітників за надзвичайний сервіс та обслуговування клієнтів, оскільки це чудовий актив для вашої компанії та приємне враження для таких клієнтів, як я. Бажаючи вам всього найкращого в майбутньому. Служба фінансування меридіанів - найкращий спосіб отримати просту позику, ось тут електронна пошта..lfdsloans @ lemeridianfds.com Або поговоріть з паном Бенджаміном на WhatsApp Via_ 1-989-394-3740 Дякую за те, що мені ще раз щиро в серці допомогли отримати кредит, я вічно вдячний.

    ОтветитьУдалить