Добавить в корзинуПозвонить
Найти в Дзене
Владимир

Полное соответствие

Доброго времени суток! Вчера читая всем известный форум 1сНиков, наткнулся на интересную задачу из собеседования, по крайней мере так писал автор. Об этом и хотел поделится. На первый взгляд элементарная задача загнала в тупик, но решение было найдено. Возможно не лучшее но на известном форуме лучше пока не кто не предложил. Суть задачи: Из справочника с двумя табличными частями выбрать записи полностью совпадающие с запрошенными с отбором по таблицам справочника. Конструкция такая (Справочник номенклатуры, Справочник спецификация) ищем в табличных частях спецификации полное совпадение Сначала все показалось просто и сходу было решение: Но вот не задача такой запрос не учитывал количество вхождений и на запрос: Вых: Н1, Н2 Исх: Н1, Н3 Выдавал две записи у которых структура заполнения была: Спец1 Вых: Н1, Н2 Исх: Н1, Н3 Спец3 Вых: Н1,Н2 Исх: Н1 Присутствовала всхожесть в список по минимуму, тут начался поиск решения. И единственное что пришло в голову нужно

Доброго времени суток!

Вчера читая всем известный форум 1сНиков, наткнулся на интересную задачу из собеседования, по крайней мере так писал автор. Об этом и хотел поделится. На первый взгляд элементарная задача загнала в тупик, но решение было найдено. Возможно не лучшее но на известном форуме лучше пока не кто не предложил.

Суть задачи: Из справочника с двумя табличными частями выбрать записи полностью совпадающие с запрошенными с отбором по таблицам справочника.

Конструкция такая (Справочник номенклатуры, Справочник спецификация) ищем в табличных частях спецификации полное совпадение

-2

Сначала все показалось просто и сходу было решение:

-3

Но вот не задача такой запрос не учитывал количество вхождений и на запрос:

Вых: Н1, Н2 Исх: Н1, Н3

Выдавал две записи у которых структура заполнения была:

Спец1 Вых: Н1, Н2 Исх: Н1, Н3
Спец3 Вых: Н1,Н2 Исх: Н1

Присутствовала всхожесть в список по минимуму, тут начался поиск решения.

И единственное что пришло в голову нужно было сравнить количество записей в первой Таблице с запросом первого (Вых) и Количество записей во второй таблице (Исх).

Спец1 имела 2 записи (Вых) и 2 записи (Исх)

Спец3 имела 2 записи (Вых) и 1 запись (Исх)

Соответственно были сделаны запросы на получение количества входных значений для каждой группы записей:

-4

Результатом выполнения мы получим количественное значение входных данных:

-5

Дальше мы превращаем сам отбор по таблицам в логическое цифровое значение

-6

Получая количественное совпадение где (КолВых и КолИсх) это количество строк в записи спецификации в конкретной таблице, а (Вых и Исх ) это совпадения 0 - нету, 1 - Одно, 2 - два

-7

Если вернутся к заданным спецификациям они имели вид:

Спец1 Вых: Н1, Н2 Исх: Н1, Н3
Спец3 Вых: Н1,Н2 Исх: Н1

Тут то мы и видим что спецификация 3 которая не должна попадать в выборку имеет значения совпадения и по первой таблице 2 = 2 и по второй таблице 1 = 1 и соответственно попадает в выборку. Соединив все ВТ_ .. (Временные таблицы) мы получим то что нам надо.

-8

основную роль выборки играет условие запроса (Которое можно кстати переделать соединением таблиц но так нагляднее)

В первых двух строчках мы выбираем записи только полностью совпадающие по количеству в запросе

ЕСТЬNULL(ВТ_Вых.КолВых, 0) = ВТ_КолЗапросВых.КолВВых

И ЕСТЬNULL(ВТ_Исх.КолИсх, 0) = ВТ_КолЗапросИсх.КолВИсх

,а второй проверяем на точное логическое соответствие

И ЕСТЬNULL(ВТ_Вых.КолВых, 0) - ЕСТЬNULL(ВТ_Вых.Вых, 0) + ЕСТЬNULL(ВТ_Исх.КолИсх, 0) - ЕСТЬNULL(ВТ_Исх.Исх, 0) = 0

и результатом такого соединения и отбора:

-9

Что и требовалось!

Возможно есть какое то более лаконичное и красивое решение, если есть желание поделитесь с народом давайте быть лучше!

Спасибо!