Выборочные данные
-- Data preparation
CREATE TABLE REQUIRED_VERSION
(
MAJOR NUMBER(3),
MINOR NUMBER(3),
MAINTENANCE NUMBER(3),
REQUIREDVERSION VARCHAR2(11)
);
CREATE TABLE OPTIMUM_VERSION
(
MAJOR NUMBER(3),
MINOR NUMBER(3),
MAINTENANCE NUMBER(3),
OPTIMUMVERSION VARCHAR2(11)
);
-- Data
Insert into OPTIMUM_VERSION (MAJOR,MINOR,MAINTENANCE,OPTIMUMVERSION) values ('20','0','0','20.0.2');
Insert into OPTIMUM_VERSION (MAJOR,MINOR,MAINTENANCE,OPTIMUMVERSION) values ('20','0','2','20.0.6');
Insert into OPTIMUM_VERSION (MAJOR,MINOR,MAINTENANCE,OPTIMUMVERSION) values ('20','0','1','20.0.4');
Insert into REQUIRED_VERSION (MAJOR,MINOR,MAINTENANCE,REQUIREDVERSION) values ('20','0','0','20.0.1');
Insert into REQUIRED_VERSION (MAJOR,MINOR,MAINTENANCE,REQUIREDVERSION) values ('20','0','1','20.0.3');
Insert into REQUIRED_VERSION (MAJOR,MINOR,MAINTENANCE,REQUIREDVERSION) values ('20','0','3',null);
Insert into REQUIRED_VERSION (MAJOR,MINOR,MAINTENANCE,REQUIREDVERSION) values ('20','0','4',null);
Insert into REQUIRED_VERSION (MAJOR,MINOR,MAINTENANCE,REQUIREDVERSION) values ('20','0','2','20.0.5');
Insert into REQUIRED_VERSION (MAJOR,MINOR,MAINTENANCE,REQUIREDVERSION) values ('20','0','5',null);
Insert into REQUIRED_VERSION (MAJOR,MINOR,MAINTENANCE,REQUIREDVERSION) values ('20','0','6',null);
Запрос
SELECT DISTINCT DEPENDENCY
FROM (
SELECT VERSION,DEPENDENCY
FROM (
SELECT MAJOR||'.'||MINOR||'.'||MAINTENANCE AS VERSION, REQUIREDVERSION AS DEPENDENCY FROM REQUIRED_VERSION
UNION
SELECT MAJOR||'.'||MINOR||'.'||MAINTENANCE AS VERSION, OPTIMUMVERSION AS DEPENDENCY FROM OPTIMUM_VERSION
)
START WITH VERSION = '20.0.0' -- Put your version number here
CONNECT BY PRIOR DEPENDENCY = VERSION AND DEPENDENCY IS NOT NULL
)
ORDER BY DEPENDENCY ASC;
Решение состоит из 3 вложенных запросов, объяснена с глубокой одной.
- Конкатенирует главную, второстепенную, версию обслуживания с точками, чтобы облегчить жизнь при обработке этой конкатенации так же, как и требуемая версия (которая является varchar2). Объединение двух таблиц в один (это, очевидно, таблица зависимостей, разделенных на две части вами)
- Иерархический запрос - делает то, на что это похоже. Для каждой строки, которая имеет зависимость, делает «root» и загружает зависимость (если она есть)
- Результат фильтрации для отображения каждой зависимости только один раз (в случае, если они были двумя версиями, зависящими от одного другого). Заказы приводятся в порядке возрастания.
Это трудно понять, каким образом таблица OptimumVersion принимает влияние на желаемый результат. В вашем выводе просто напечатайте все строки в RequiredVersion в некотором порядке. Можете ли вы дать нам более сложный пример? –
см., Скажем, i/p - 20.0.0, мы должны проверить требуемую версию table major = 20, minor = 0 и maintenance = 0. если есть какая-то необходимая версия, получите это. как мудрый, мы должны проверить оптимальную версию таблицы major = 20, minor = 0 и maintenance = 0 и получить оптимальную версию. для каждого req или opt vers мы должны следовать вышеуказанным шагам – Akshobhya