|
Вложенные запросы - проблема с левым соединением | ☑ | ||
---|---|---|---|---|
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
|
Хотя нет, Извиняюсь я не прав, не верно прочел что требуется получить
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |