Как правильно написать запрос?

1. user2018771 31.01.25 21:01 Сейчас в теме
Добрый день!

Подскажите пожалуйста как написать запрос, что-то голова отказывается соображать.

Есть РС СвязиДокументов, независимый, непериодический, имеет два измерения ОсновнойДокумент, и ПодчиненныйДокумент имеющий определяемый тип.
Есть ДокументОснова который является измерением ОсновнойДокумент.
Есть ДокументДочерний у которого есть реквизит Итоговый. Документ иногда бывает в измерении ПодчиненныйДокумент.

Прямой связи между документами нет.

В общем задача такова, нужно отобрать только такие Документ1, для которых в записях РС СвязиДокументов все связанные Документ2 имеют реквизит Итоговый = Истина, если среди связанных Документ2 есть имеющие Итоговый = Ложь, то такие Документ1 не допускать в выборку.

Пожалуйста укажите в какую сторону посмотреть, заранее благодарен ♥
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
7. SlavaKron 02.02.25 11:45 Сейчас в теме +1 $m
(6)
Тут возможно ошибка?
Нет, это один из базовых приёмов в sql - гуглите что-нибудь вроде "удалить из таблицы строки другой таблицы".
Может наоборот связать записи регистра по условию неравенства?
Технически, сработает, но будет очень медленно.
Записей Null в РС не предполагается
Это часть приема по исключению записей ВТ_Исключить из выборки по Регистру: условие в секции ГДЕ накладываются после связи таблиц, нам нужны только те записи из таблицы СвязиДокументов, для которых не найдены строки из таблицы ВТ_Исключить, т.е. ВТ_Исключить.ОсновнойДокумент ЕСТЬ NULL.
для получения записей только по одному типу
Если я правильно понял, надо так доработать запрос
ВЫБРАТЬ РАЗЛИЧНЫЕ
    СвязиДокументов.ОсновнойДокумент КАК ОсновнойДокумент
ПОМЕСТИТЬ ВТ_Исключить
ИЗ
    РегистрСведений.СвязиДокументов КАК СвязиДокументов
ГДЕ
    ТИПЗНАЧЕНИЯ(СвязиДокументов.ПодчиненныйДокумент) = ТИП(Документ.Подчиненный)
    И НЕ ВЫРАЗИТЬ(СвязиДокументов.ПодчиненныйДокумент КАК Документ.Подчиненный).Итоговый

ИНДЕКСИРОВАТЬ ПО
    ОсновнойДокумент
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    СвязиДокументов.ОсновнойДокумент КАК ОсновнойДокумент,
    СвязиДокументов.ПодчиненныйДокумент КАК ПодчиненныйДокумент
ИЗ
    РегистрСведений.СвязиДокументов КАК СвязиДокументов
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Исключить КАК ВТ_Исключить
        ПО СвязиДокументов.ОсновнойДокумент = ВТ_Исключить.ОсновнойДокумент
ГДЕ
    ВТ_Исключить.ОсновнойДокумент ЕСТЬ NULL
Показать
user2018771; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. SlavaKron 01.02.25 14:58 Сейчас в теме
(1)
ВЫБРАТЬ РАЗЛИЧНЫЕ
    СвязиДокументов.ОсновнойДокумент КАК ОсновнойДокумент
ПОМЕСТИТЬ ВТ_Исключить
ИЗ
    РегистрСведений.СвязиДокументов КАК СвязиДокументов
ГДЕ
    НЕ СвязиДокументов.ПодчиненныйДокумент.Итоговый
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    СвязиДокументов.ОсновнойДокумент КАК ОсновнойДокумент,
    СвязиДокументов.ПодчиненныйДокумент КАК ПодчиненныйДокумент
ИЗ
    РегистрСведений.СвязиДокументов КАК СвязиДокументов
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Исключить КАК ВТ_Исключить
        ПО СвязиДокументов.ОсновнойДокумент = ВТ_Исключить.ОсновнойДокумент
ГДЕ
    ВТ_Исключить.ОсновнойДокумент ЕСТЬ NULL
Показать
user2018771; +1 Ответить 3
6. user2018771 02.02.25 00:11 Сейчас в теме
(5) Большое спасибо за решение, только немного непонятна часть
ИЗ
    РегистрСведений.СвязиДокументов КАК СвязиДокументов
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Исключить КАК ВТ_Исключить
        ПО СвязиДокументов.ОсновнойДокумент = ВТ_Исключить.ОсновнойДокумент

Тут возможно ошибка? Может наоборот связать записи регистра по условию неравенства? Вроде как...
ПО СвязиДокументов.ОсновнойДокумент <b><></b> ВТ_Исключить.ОсновнойДокумент


И это условие. Не понимаю зачем оно? Записей Null в РС не предполагается... Или я неверно рассуждаю...
ГДЕ
    ВТ_Исключить.ОсновнойДокумент ЕСТЬ NULL


И ещё подскажете пожалуйста, для получения записей только по одному типу подчиненных документов правильно ли будет в ВТ_Исключить добавить такое выражение
ГДЕ 
НЕ (ВЫБОР
          КОГДА СвязиДокументов.ПодчиненныйДокумент ССЫЛКА Документ.Подчиненный
          ТОГДА ВЫРАЗИТЬ(СвязиДокументов.ПодчиненныйДокумент КАК Документ.Подчиненный).Итоговый
       КОНЕЦ)

Или приведение типа можно реализовать иначе и в другом месте запроса?
7. SlavaKron 02.02.25 11:45 Сейчас в теме +1 $m
(6)
Тут возможно ошибка?
Нет, это один из базовых приёмов в sql - гуглите что-нибудь вроде "удалить из таблицы строки другой таблицы".
Может наоборот связать записи регистра по условию неравенства?
Технически, сработает, но будет очень медленно.
Записей Null в РС не предполагается
Это часть приема по исключению записей ВТ_Исключить из выборки по Регистру: условие в секции ГДЕ накладываются после связи таблиц, нам нужны только те записи из таблицы СвязиДокументов, для которых не найдены строки из таблицы ВТ_Исключить, т.е. ВТ_Исключить.ОсновнойДокумент ЕСТЬ NULL.
для получения записей только по одному типу
Если я правильно понял, надо так доработать запрос
ВЫБРАТЬ РАЗЛИЧНЫЕ
    СвязиДокументов.ОсновнойДокумент КАК ОсновнойДокумент
ПОМЕСТИТЬ ВТ_Исключить
ИЗ
    РегистрСведений.СвязиДокументов КАК СвязиДокументов
ГДЕ
    ТИПЗНАЧЕНИЯ(СвязиДокументов.ПодчиненныйДокумент) = ТИП(Документ.Подчиненный)
    И НЕ ВЫРАЗИТЬ(СвязиДокументов.ПодчиненныйДокумент КАК Документ.Подчиненный).Итоговый

ИНДЕКСИРОВАТЬ ПО
    ОсновнойДокумент
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    СвязиДокументов.ОсновнойДокумент КАК ОсновнойДокумент,
    СвязиДокументов.ПодчиненныйДокумент КАК ПодчиненныйДокумент
ИЗ
    РегистрСведений.СвязиДокументов КАК СвязиДокументов
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Исключить КАК ВТ_Исключить
        ПО СвязиДокументов.ОсновнойДокумент = ВТ_Исключить.ОсновнойДокумент
ГДЕ
    ВТ_Исключить.ОсновнойДокумент ЕСТЬ NULL
Показать
user2018771; +1 Ответить
8. user2018771 02.02.25 15:45 Сейчас в теме
(7) Теперь стало понятно! Большое спасибо за помощь! ♥
2. user2107191 31.01.25 21:06 Сейчас в теме
Показывай, в какую уже посмотрел.
3. miniogn 44 31.01.25 22:06 Сейчас в теме
Ну вот же на картинке, ты уже всё сделал, соединил и сгруппировал документы, и применил условие.
Вот прямо так и делай в запросе.
4. user2018771 31.01.25 22:16 Сейчас в теме
(3) по очередности не понимаю, ну и как в коде это будет выглядеть. С запросами мало совсем приходилось сталкиваться
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот