Имя: Пароль:
1C
1С v8
Вложенные запросы - проблема с левым соединением
0 mishula2005
 
19.02.16
08:47
Добрый день! Помогите, пожалуйста, с запросом.
Есть ТЗ1: Регламент Этап
            Р1       Э1
            Р1       Э2
            Р1       Э3
            Р2       Э1
            Р3       Э2

И ТЗ2:   Регламент Этап НомерЭтапа
            Р1      Э1     7
            Р1      Э2     8
            Р1      Э3     6
            Р2      Э1     3
            Р3      Э4     2

К ТЗ1 нужно добавить поле Этап из ТЗ2 по условию ТЗ1.Р1=ТЗ2.Р2 с минимальным номером этапа.

     ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТЗ1.Регламент,
    ТЗ1.Этап,
    ВложенныйЗапрос.ТекущийЭтап
        ИЗ РегистрСведений.МойРегистрСведений КАК ТЗ1
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
            ТЗ2.Регламент КАК Регламент,
            ТЗ2.Этап КАК ТекущийЭтап,
            ТЗ2.ПорядковыйНомерВыполнения
        ИЗ
            РегистрСведений.МойРегистр2 КАК ТЗ2
            
        УПОРЯДОЧИТЬ ПО
            ТЗ2.ПорядковыйНомерВыполнения) КАК          
                                                    ВложенныйЗапрос
        ПО ТЗ1.Регламент= ВложенныйЗапрос.Регламент

При таком запросе берет только первый этап из ТЗ2, а к остальным регламентам не устанавливает этап.
1 фобка
 
19.02.16
08:49
"Выбрать первые 1" - копать здесь
2 aleks_default
 
19.02.16
09:03
нахрен вложенный запрос не нужен, соединяй и группируй с МИНИМУМ
3 Ma3eIIa
 
19.02.16
09:19
(0) Только меняешь период на свой номер этапа. минимум и убираешь условие

ВЫБРАТЬ
    ТЗ.Период,
    ТЗ.Сотрудник,
    ТЗ.Состояние
ПОМЕСТИТЬ ВТ
ИЗ
    (ВЫБРАТЬ
        ДАТАВРЕМЯ(2013, 1, 1) КАК Период,
        "Иванов" КАК Сотрудник,
        "Работает" КАК Состояние
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ДАТАВРЕМЯ(2013, 1, 5),
        "Петров",
        "В_Отпуске"
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ДАТАВРЕМЯ(2013, 1, 9),
        "Иванов",
        "Болеет"
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ДАТАВРЕМЯ(2013, 1, 12),
        "Иванов",
        "Работает"
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ДАТАВРЕМЯ(2013, 1, 13),
        "Петров",
        "Работает") КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ВТ.Период) КАК Период,
    ВТ.Сотрудник
ПОМЕСТИТЬ ВтМаксимум
ИЗ
    ВТ КАК ВТ
ГДЕ
    ВТ.Период <= &Период

СГРУППИРОВАТЬ ПО
    ВТ.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Сотрудник,
    ВТ.Состояние
ИЗ
    ВТ КАК ВТ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтМаксимум КАК ВтМаксимум
        ПО ВТ.Период = ВтМаксимум.Период
4 mishula2005
 
19.02.16
09:44
Всем спасибо. Наконец-то разобралась!
5 mishula2005
 
19.02.16
09:49
(3) На основе совета (3) построила запрос:

ВЫБРАТЬ
    СостоянияЭтапов.Регламент КАК Регламент ,
    СостоянияЭтапов.Этап КАК Этап,
    СостоянияЭтапов.ПорядковыйНомерВыполнения
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрСведений.МойРегистр КАК СостоянияЭтапов
;

////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МИНИМУМ(ВТ.ПорядковыйНомерВыполнения),
    ВТ.Регламент
ПОМЕСТИТЬ ВтМинимум
ИЗ
    ВТ КАК ВТ

СГРУППИРОВАТЬ ПО
    ВТ.Регламент
;

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

////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЗРегламенты.Регламент,
    ТЗТекЭтапы.ТекущийЭтап
ИЗ
    РегистрСведений.МойРегистр2 КАК ТЗРегламенты
        ЛЕВОЕ СОЕДИНЕНИЕ ТЗТекЭтапы КАК ТЗТекЭтапы
        ПО ТЗРегламенты.Регламент= ТЗТекЭтапы.Регламент
6 Windyhead
 
19.02.16
11:50
(5) Прости, но ты фигню написала.

Делай выборку из МойРегистр2 и соединяй его Левым с Мой регистр , И группировку Регламент МИНИМУМ(ВТ.ПорядковыйНомерВыполнения)

В итоге один запрос с одним соединением и одной группировкой. никаких вложенных запросов и временных таблиц
7 Windyhead
 
19.02.16
11:52
Хотя нет, Извиняюсь я не прав, не верно прочел что требуется получить
2 + 2 = 3.9999999999999999999999999999999...