Имя: Пароль:
1C
1С v8
Запрос СОЕДИНЕНИЕ (брать только одну запись с правой таблицы)
0 MistaEr
 
21.01.16
11:25
Нужно выбрать договора контрагентов с наибольшей датой. Нельзя использовать ВТ, все это нужно для динамического списка.

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

Вроде бы работает, но если у одного контрагента 2 договора с одинаковой датой, выводит по контрагенту 2 строчки.
1 mehfk
 
21.01.16
11:27
ВЫБРАТЬ
    ВложенныйЗапрос.Владелец,

    МАКСИМУМ(ВложенныйЗапрос1.Ссылка)
ИЗ
    (ВЫБРАТЬ

        ДоговорыКонтрагентов.Владелец КАК Владелец,
        МАКСИМУМ(ДоговорыКонтрагентов.Дата) КАК Дата
    ИЗ
        Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    ГДЕ
        ДоговорыКонтрагентов.Дата <> &ПустаяДата
    
    СГРУППИРОВАТЬ ПО
        ДоговорыКонтрагентов.Владелец) КАК ВложенныйЗапрос
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ДоговорыКонтрагентов.Ссылка КАК Ссылка,
            ДоговорыКонтрагентов.Владелец КАК Владелец,
            ДоговорыКонтрагентов.Дата КАК Дата
        ИЗ
            Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов) КАК ВложенныйЗапрос1
        ПО ВложенныйЗапрос.Владелец = ВложенныйЗапрос1.Владелец
            И ВложенныйЗапрос.Дата = ВложенныйЗапрос1.Дата
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Владелец
2 MistaEr
 
21.01.16
11:33
ВЫБРАТЬ
    ДоговорыКонтрагентов.Владелец,
    МАКСИМУМ(ДоговорыКонтрагентов.Дата) КАК Дата,
    МАКСИМУМ(ДоговорыКонтрагентов.Ссылка) КАК Ссылка
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
    ДоговорыКонтрагентов.Дата <> &ПустаяДата

СГРУППИРОВАТЬ ПО
    ДоговорыКонтрагентов.Владелец
3 MistaEr
 
21.01.16
11:34
(1) а так может задвоиться? в моем тесте получается очень даже хорошо и конечно быстрее
4 mehfk
 
21.01.16
11:38
(3) В параллельной вселенной, где запросы SQL работают не так, как в нашей - возможно.
5 asady
 
21.01.16
11:39
(0) а какой тогда договор выводить если их на самом деле 2 с одной и той же датой?
6 Mort
 
21.01.16
11:42
(2) Не взлетит, будет вообще левый договор. Нужно сначала сделать операцию с датой, а потом повторить такой же фокус с сылкой. Т.е. еще одно соединение но с датами, сгруппированными по максимуму ссылок.
7 MistaEr
 
21.01.16
11:46
(5) Можно любой, но хотелось бы с большим кодом, т.е. созданный позже
8 MistaEr
 
21.01.16
11:46
(6) Т.е. лучше сделать (1) , а не (2) ? По скорости конечно уступает....
9 MistaEr
 
21.01.16
13:09
(8)
10 mehfk
 
21.01.16
13:11
11 MistaEr
 
21.01.16
13:27
(10) Не нашел. Оставлю (2), дальше видно будет
12 mistеr
 
21.01.16
13:32
(7) В вашей вселенной нет реквизита ОсновнойДоговор?
13 MistaEr
 
21.01.16
13:37
(12) Основной не нужен
Основная теорема систематики: Новые системы плодят новые проблемы.