Имя: Пароль:
1C
 
1c Запрос пересечение двух таблиц
0 illiona
 
naïve
15.11.23
12:55
Добрый день. Две талицы, надо вывести пересечение по периоду между ними
"ВЫБРАТЬ
|            ТабДокументы.ДокументСсылка КАК ДокументСсылка,
|            ТабДокументы.ДатаНачала КАК ДатаНачала,
|            ТабДокументы.ДатаОкончания КАК ДатаОкончания,
|            ТабДокументы.Сотрудник КАК Сотрудник
|        ПОМЕСТИТЬ ТабДокументы
|        ИЗ
|            &ТаблицаДокументов КАК ТабДокументы
|        ;
|        
|        ////////////////////////////////////////////////////////////////////////////////
|        ВЫБРАТЬ
|            ТабДокумент.ДокументСсылка КАК ДокументСсылка,
|            ТабДокумент.ДатаНачала КАК ДатаНачала,
|            ТабДокумент.ДатаОкончания КАК ДатаОкончания,
|            ТабДокумент.Сотрудник КАК Сотрудник
|        ПОМЕСТИТЬ ТабДокументы1
|        ИЗ
|            &ТаблицаДокументов КАК ТабДокумент
|        ;
|        
|        ////////////////////////////////////////////////////////////////////////////////
|        ВЫБРАТЬ
|            ТабДокументы.ДокументСсылка КАК ПервыйДокумент,
|            ТабДокументы1.ДокументСсылка КАК ДокументСсылка,
|            ТабДокументы.Сотрудник КАК Сотрудник,
|            ТабДокументы.ДатаНачала КАК ДатаНачала,
|            ТабДокументы.ДатаОкончания КАК ДатаОкончания,
|            ТабДокументы1.ДатаНачала КАК ДатаНачала1,
|            ТабДокументы1.ДатаОкончания КАК ДатаОкончания1
|        ИЗ
|            ТабДокументы КАК ТабДокументы
|                ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабДокументы1 КАК ТабДокументы1
|                ПО (ТабДокументы1.ДатаНачала МЕЖДУ ТабДокументы.ДатаНачала И ТабДокументы.ДатаОкончания)
|                    И (ТабДокументы1.ДатаОкончания МЕЖДУ ТабДокументы.ДатаНачала И ТабДокументы.ДатаОкончания)
|                    И ТабДокументы.ДокументСсылка <> ТабДокументы1.ДокументСсылка
|                    И ТабДокументы.Сотрудник = ТабДокументы1.Сотрудник"

https://disk.yandex.ru/i/THrjMrB91TbZEQ
Получается двойное пересечение
1 Bigbro
 
15.11.23
13:03
а как ты хочешь?
каждый с каждым пересекается но не с собой.
2 illiona
 
naïve
15.11.23
13:04
получается, мне надо чтоб одна запись осталась, поидее они одинаковые
3 Bigbro
 
15.11.23
13:06
с чего это вдруг они одинаковые.
в первой записи док1 док2
во второй записи док2, док1
4 illiona
 
naïve
15.11.23
13:11
т.е. получается это верно?
5 nodrama
 
15.11.23
13:13
я думаю автор хотел что бы строчка была одна в итоге, а не две как на картинке. так как у этих двух доков одинаковый период сотрудник и тд
6 illiona
 
naïve
15.11.23
13:15
а если всё таки именно при таких случаях скажут выводит одну запись, что в запросе надо поменять?
7 illiona
 
naïve
15.11.23
13:16
(5) да нужна в таких случаях одна строка
8 maxab72
 
15.11.23
13:46
(7) При объединении сравнивать документы по УИД через ВЫБОР КОГДА, и тот что с меньшим - ставить всегда первым реквизитом. и ВЫБРАТь РАЗЛИЧНЫЕ.
9 Лирик
 
15.11.23
13:54
Интересно, что покажет запрос когда ТабДокументы1.ДатаНачала<=ТабДокументы.ДатаНачала И ТабДокументы1.ДатаОкончания>=ТабДокументы.ДатаНачала
Ну если конечно один документ "Отсутствие с сохранением оплаты" может "закрыть" сразу 2 больничных.
10 illiona
 
naïve
15.11.23
15:16
(9) тоже самое получается
11 Bigbro
 
15.11.23
15:28
попробуй по датам сделать строгое неравенство. по идее таблица 1 внутри второй.
между видимо равенство тоже учитывает из за этого задваивается.
12 illiona
 
naïve
15.11.23
15:32
(11) не поняла где сделать строгое равенство
13 Bigbro
 
15.11.23
15:36
ПО (ТабДокументы1.ДатаНачала МЕЖДУ ТабДокументы.ДатаНачала И ТабДокументы.ДатаОкончания)
вот тут между срабатывает когда дата1 = дата2
надо чтобы при равенстве не срабатывало условие.
было строго >
14 illiona
 
naïve
15.11.23
16:28
при строгом равенстве, пустой запрос
15 illiona
 
naïve
15.11.23
16:35
|        ////////////////////////////////////////////////////////////////////////////////
|        ВЫБРАТЬ
|            ТабДокументы.ДокументСсылка КАК ПервыйДокумент,
|            ТабДокументы1.ДокументСсылка КАК ДокументСсылка,
|            ТабДокументы.Сотрудник КАК Сотрудник,
|            ТабДокументы.ДатаНачала КАК ДатаНачала,
|            ТабДокументы.ДатаОкончания КАК ДатаОкончания,
|            ТабДокументы1.ДатаНачала КАК ДатаНачала1,
|            ТабДокументы1.ДатаОкончания КАК ДатаОкончания1
|        ИЗ
|            ТабДокументы КАК ТабДокументы
|                ВНУТРЕнНЕЕ СОЕДИНЕНИЕ ТабДокументы1 КАК ТабДокументы1
|                ПО (ТабДокументы1.ДатаНачала > ТабДокументы.ДатаНачала И ТабДокументы1.ДатаНачала < ТабДокументы.ДатаОкончания)
|                    И (ТабДокументы1.ДатаОкончания МЕЖДУ ТабДокументы.ДатаНачала И ТабДокументы.ДатаОкончания)
|                    И ТабДокументы.ДокументСсылка <> ТабДокументы1.ДокументСсылка
|                    И ТабДокументы.Сотрудник = ТабДокументы1.Сотрудник"
16 Лирик
 
15.11.23
16:35
(10) Простите не увидел, что у вас таблица одна и та же.
Ввело в заблуждение в (0) "Две таблицы".
Тогда не надо второй раз выбирать во временную таблицу:
"ВЫБРАТЬ
|    ТабДокументы.ДокументСсылка КАК ДокументСсылка,
|    ТабДокументы.ДатаНачала КАК ДатаНачала,
|    ТабДокументы.ДатаОкончания КАК ДатаОкончания,
|    ТабДокументы.Сотрудник КАК Сотрудник,
|    АВТОНОМЕРЗАПИСИ() КАК Автономер
|ПОМЕСТИТЬ ТабДокументы
|ИЗ
|    &ТаблицаДокументов КАК ТабДокументы
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ТабДокументы.ДокументСсылка КАК ПервыйДокумент,
|    ТабДокументы1.ДокументСсылка КАК ДокументСсылка,
|    ТабДокументы.Сотрудник КАК Сотрудник,
|    ТабДокументы.ДатаНачала КАК ДатаНачала,
|    ТабДокументы.ДатаОкончания КАК ДатаОкончания,
|    ТабДокументы1.ДатаНачала КАК ДатаНачала1,
|    ТабДокументы1.ДатаОкончания КАК ДатаОкончания1
|ИЗ
|    ТабДокументы КАК ТабДокументы
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабДокументы КАК ТабДокументы1
|        ПО ТабДокументы.Сотрудник = ТабДокументы1.Сотрудник
|            И (ТабДокументы.ДатаНачала МЕЖДУ ТабДокументы1.ДатаНачала И ТабДокументы1.ДатаОкончания
|                ИЛИ ТабДокументы.ДатаОкончания МЕЖДУ ТабДокументы1.ДатаНачала И ТабДокументы1.ДатаОкончания
|                ИЛИ ТабДокументы1.ДатаНачала МЕЖДУ ТабДокументы.ДатаНачала И ТабДокументы.ДатаОкончания
|                ИЛИ ТабДокументы1.ДатаОкончания МЕЖДУ ТабДокументы.ДатаНачала И ТабДокументы.ДатаОкончания)
|            И ТабДокументы.Автономер > ТабДокументы1.Автономер"

Соединение по автономеру "убъет" дубли, дополнительное сравнение интервалов в связи позволит найти интервалы пересекающиеся как в одну, так и в другую сторону.
Связь по ссылкам не нужна, ее заменяет строгое сравнение Автономера.

Естественно в исходной таблице не должно быть дублей строк.

(13) Тогда из выборки выпадут пары документов с одинаковыми датами начала и окончания
17 НафНаф
 
15.11.23
22:39
(16) не нужен автономен. Достаточно одна ссылка больше другой
18 Волшебник
 
15.11.23
22:48
(17) ссылки не сравниваются на больше-меньше
Независимо от того, куда вы едете — это в гору и против ветра!