Как получить все рекурсивные родительские строки дочерней строки в Oracle SQL? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть иерархические данные категории продуктов.Это трехуровневая иерархия, и все продукты всегда будут привязаны к последнему уровню.Я хочу показать подробный отчет обо всех продуктах, сгруппированных по категориям - подкатегория и подкатегория.В отчете будут отображаться только те категории, для которых мы имеем результат продукта.(Результат Продукты определяются по некоторым другим критериям и выходят за рамки этого вопроса).

Как получить все данные категории до корневого уровня в Oracle?

Образец данных

 CategoryId   Name           Parent
    1            Clothing       NULL
    2            Men's Wear     1
    3            Shirt          2
    4            T-Shirt        2
    5            Women's Wear   1
    6            Salwar         5
    7            Saree          5
    8            Electronics    NULL
    9            Computers      8
    10           Mobiles        8

Таблица продуктов будет иметь ссылку на идентификатор категории.Ex.3, 4 или 6, 7 и т. Д. Я хочу получить только категории до корневого уровня, где у нас есть продукты.У меня есть запрос ниже, но я не уверен, если это хорошая практика, чтобы указать несколько значений для START WITH предложения.Есть ли лучший вариант?

SELECT DISTINCT CategoryId,Name,Parent
FROM   tblCategory
START WITH CategoryId IN (3,6)
CONNECT BY CategoryId = PRIOR Parent

Для приведенного выше запроса я указал только две категории, но в реальном мире это могут быть тысячи.Ниже приведены данные результатов, показывающие только категории для выбранных продуктов.

Вывод:

 CategoryId  Name          Parent
    1        Clothing      NULL
    2        Men's Wear    1
    3        Shirt         2
    5        Women's Wear  1
    6        Salwar        5  

1 Ответ

0 голосов
/ 18 декабря 2018

Итак, вы в основном решили свою проблему.Вы можете перечислить идентификаторы, как вы сделали, или вы можете хранить их где-то и использовать в IN подзапрос, как здесь, например:

with tblCategory(CategoryId, Name, Parent) as (
    select  1, 'Clothing',      null from dual union all
    select  2, 'Men''s Wear',   1    from dual union all
    select  3, 'Shirt',         2    from dual union all
    select  4, 'T-Shirt',       3    from dual union all
    select  5, 'Women''s Wear', 1    from dual union all
    select  6, 'Salwar',        5    from dual union all
    select  7, 'Saree',         5    from dual union all
    select  8, 'Electronics',   null from dual union all
    select  9, 'Computers',     8    from dual union all
    select 10, 'Mobiles',       8    from dual ),
  ids(cid) as (select 3 from dual union all select 6 from dual)
select distinct categoryid, name, parent
  from tblcategory
  start with categoryid in (select cid from ids)
  connect by categoryid = prior parent

Результат:

CATEGORYID NAME             PARENT
---------- ------------ ----------
         6 Salwar                5
         3 Shirt                 2
         5 Women's Wear          1
         2 Men's Wear            1
         1 Clothing   

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

select connect_by_root(categoryid) root, 
       sys_connect_by_path(name, ' => ') path
  from tblcategory
  where connect_by_isleaf = 1
  start with categoryid in (select cid from ids)
  connect by categoryid = prior parent

Результат:

  ROOT PATH
------ --------------------------------------------------------------------------------
     3  => Shirt => Men's Wear => Clothing
     6  => Salwar => Women's Wear => Clothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...