2016-07-03 4 views
2

У меня есть две таблиц в Oracle для получения версии программного обеспеченияРекурсивного запрос в оракуле

RequiredVersion Table 
major minor maintenance requiredversion 
20  0  0   20.0.1 
20  0  1   20.0.3 
20  0  3   null 
20  0  4   null 
20  0  2   20.0.5 
20  0  5   null 
20  0  6   null 

OptimumVersion Table 
major minor maintenance optimumver 
20  0  0   20.0.2 
20  0  2   20.0.6 
20  0  1   20.0.4 

Пользователя отправит вход 20.0.0 для этой версии я нахожусь расщеплением и сравнения с основным минором и техническим обслуживанием в обеих таблицах , как я могу получить все зависимости т.е. требуется версии и оптимальный вариант

I/P  20.0.0 
O/p  20.0.1 
      20.0.2 
      20.0.3 
      20.0.4 
      20.0.5 
      20.0.6 

Каждая версия я может или не может потребоваться и оптимальный вариант. Я много пробовал, используя запрос, но не получая, как мы можем позвонить в loop.Please помочь мне решить эту проблему.

Structure :    20.0.0 
         /  \ 
     (reqver) 20.0.1   20.0.2 (optimumvers) 
       / \  / \ 
      20.0.3  20.0.4 20.0.5 20.0.6 
      (reqver) (optver) (req)  (opt) 

Заранее спасибо

+0

Это трудно понять, каким образом таблица OptimumVersion принимает влияние на желаемый результат. В вашем выводе просто напечатайте все строки в RequiredVersion в некотором порядке. Можете ли вы дать нам более сложный пример? –

+0

см., Скажем, i/p - 20.0.0, мы должны проверить требуемую версию table major = 20, minor = 0 и maintenance = 0. если есть какая-то необходимая версия, получите это. как мудрый, мы должны проверить оптимальную версию таблицы major = 20, minor = 0 и maintenance = 0 и получить оптимальную версию. для каждого req или opt vers мы должны следовать вышеуказанным шагам – Akshobhya

ответ

1

Выборочные данные

-- 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 вложенных запросов, объяснена с глубокой одной.

  1. Конкатенирует главную, второстепенную, версию обслуживания с точками, чтобы облегчить жизнь при обработке этой конкатенации так же, как и требуемая версия (которая является varchar2). Объединение двух таблиц в один (это, очевидно, таблица зависимостей, разделенных на две части вами)
  2. Иерархический запрос - делает то, на что это похоже. Для каждой строки, которая имеет зависимость, делает «root» и загружает зависимость (если она есть)
  3. Результат фильтрации для отображения каждой зависимости только один раз (в случае, если они были двумя версиями, зависящими от одного другого). Заказы приводятся в порядке возрастания.
+0

Спасибо, что это работает :) – Akshobhya

+0

'distinct' is ** NOT ** a function –

+0

Вы правы. благодаря – peterpepo

0

Тестовые данные

WITH RequiredVersion(major, minor, maintenance, requiredversion) AS(
SELECT 20,0,0,'20.0.1' FROM dual 
    UNION all 
SELECT 20,0,1,'20.0.3' FROM dual 
    UNION all 
SELECT 20,0,3,null FROM dual 
    UNION all 
SELECT 20,0,4,null FROM dual 
    UNION all 
SELECT 20,0,2,'20.0.5' FROM dual 
    UNION all 
SELECT 20,0,5,null FROM dual 
    UNION all 
SELECT 20,0,6,null FROM dual), 
OptimumVersion(major, minor, maintenance, optimumver) AS(
SELECT 20,0,0,'20.0.2' FROM dual 
    UNION all 
SELECT 20,0,2,'20.0.6' FROM dual 
    UNION all 
SELECT 20,0,1,'20.0.4' FROM dual) 

Запрос

SELECT DISTINCT major, minor, maintenance FROM 
(SELECT * FROM RequiredVersion UNION ALL SELECT * FROM OptimumVersion) 
    CONNECT BY PRIOR requiredversion = major || '.' || minor || '.' || maintenance 
    START WITH major = 20 and minor= 0 and maintenance = 0 
    ORDER BY major, minor, maintenance 

Для меня это до сих пор трудно понять логику. В этом запросе я пытаюсь объединить данные из RequiredVersion и OptimumVersion и строить иерархию, удаляя повторяющиеся строки.

+0

Хорошо, спасибо. Позвольте мне поработать над этим, чтобы получить требуемые данные. – Akshobhya

0

Это решение, использующее рекурсивный факторируемый подзапрос. Он использует переменную связывания: inputversion в качестве механизма для ввода отправной точки (например, 20.0.0)

with 
    dep_version (version, dependentversion) as (
     select major || '.' || minor || '.' || maintenance, requiredversion 
     from required_version 
     union all 
     select major || '.' || minor || '.' || maintenance, optimumversion 
     from optimum_version 
    ), 
    rec (dependentversion) as (
     select :inputversion from dual 
     union all 
     select d.dependentversion 
     from rec r inner join dep_version d 
          on r.dependentversion = d.version 
     where d.dependentversion is not null 
    ) 
select dependentversion 
from rec 
where dependentversion != :inputversion 
; 
Смежные вопросы