Я пытаюсь реализовать внешний интерфейс для решения для отчетности, которое зависит от безопасности. Пользователь может выбрать из 12 уровней вложенных критериев, значение каждого из которых влияет на все значения ниже.
Таким образом, выбор критериев на странице (каждый из них является раскрывающимся списком) выглядит примерно так:
Критерии 1
Критерии 2
...
Критерии 12
Существует таблица безопасности, в которой хранятся значения, доступные каждому пользователю, которая имеет следующую структуру:
EmployeeID | Criteria_1_valid_Value | C2_valid_Value | ... | C12_valid_Value
x0001 | c1 | c2 | ... | c12
и у каждого сотрудника будет одна или (много) больше строк в этой таблице. Думайте об этом как о сплющенном дереве с Criteria1 в качестве корневого узла.
Исходя из ключей, изменение Критерия 1 повлияет на значения, видимые в Критериях с 2 по 12. Точно так же изменение значения в Критериях 2 влияет на значения, доступные в Критериях с 3 по Критерии 12. На каждом уровне опция для выбора «Все значения», которая представлена пробелом для поиска. Поэтому мне нужно представление в справочной таблице / представлении, которое учитывает наличие пробела на одном или нескольких уровнях.
Мне трудно найти способ построить представление / таблицу поиска для каждого поля Criteria с использованием sql, не прибегая к жесткому кодированию.
Например, для построения поиска по критерию 2 sql может выглядеть так:
select EmployeeID, Criteria1, Criteria2
from Security
Union
select EmployeeID, ' ', Criteria2
from Security
Union
select EmployeeID, Criteria1, ' '
from Security
UNION
select EmployeeID, ' ', ' '
from Security
И так далее. К сожалению, конечно, с 12 уровнями, последний работает на 2 ^ 12 союзов, которые откровенно пахнут.
Я пытался создать таблицу для каждого уровня в пакете, фиксировать после каждого, затем использовать предыдущую таблицу, присоединенную к таблице безопасности, чтобы построить следующую с одним UNION в каждом, но я не могу получить присоединяется для правильной работы с пробелами.
Я не знаю, переоцениваю ли я это или полностью упускаю что-то, но я чувствую, что должно быть более простое решение.
РЕДАКТИРОВАТЬ: Это на Oracle, и я работаю с продуктом ERP в качестве базовой технологии.
EDIT2: Спасибо за вклад всех. Я получил корректное соединение, используя соединения, как в примере proc из @Alex Poole ниже:
and (v_Criteria_1 = ' ' or Criteria_1_valid_Value = v_Criteria_1)
Мне не хватало v_Criteria_1 = ' ' or
.
Итак, теперь таблицы загружены правильно (достаточно). Это превращается в упражнение по настройке / оптимизации. Я собираюсь посмотреть на процесс от @Alex Poole и арифметический подход @ JD_55, который, я думаю, может быть очень быстрым.