Как сделать объединение в иерархическом запросе - PullRequest
0 голосов
/ 12 мая 2018

У меня есть эти две таблицы:

CREATE TABLE Category
(
    curCategory VARCHAR2(50) PRIMARY KEY,
    parentCategory VARCHAR(50),

    CONSTRAINT check_cat CHECK (curCategory is not null),
    CONSTRAINT fk_category1 FOREIGN KEY(parentCategory) REFERENCES Category(curCategory)
);

CREATE TABLE Article
(
    name VARCHAR(50)
    artCategory VARCHAR(50),

    CONSTRAINT pk_article PRIMARY KEY(name),
    CONSTRAINT fk_artCategory FOREIGN KEY(artCategory) REFERENCES Category(curCategory)
);

То, что я хочу, выглядит примерно так:

Select 
    level, curCategory, parentCategory 
from 
    Category 
join 
    article on artCategory = curCategory
start with curCategory = 'Clothes'
connect by prior curCategory = parentCategory 
order siblings by curCategory;

Я хочу напечатать каждую статью, которая является одеждой.Поэтому я хотел пройтись по каждой дочерней категории, включая саму категорию («Одежда»), и проверить, соответствует ли категория статьи curCategory.Но когда я выполняю свой запрос, я получаю ноль записей.

1 Ответ

0 голосов
/ 12 мая 2018

Синтаксис выглядит как Oracle, так что вот один вариант, который показывает, что вы можете сделать.

Используйте VARCAHR**2** тип данных, а не VARCHAR.Я сократил длину столбцов, чтобы их было проще отображать.Также произошла синтаксическая ошибка (пропущенная запятая в конце объявления столбца article.name).

SQL> create table category (
  2    curcategory      varchar2(20) primary key,
  3    parentcategory   varchar2(20),
  4    constraint check_cat check ( curcategory is not null ),
  5    constraint fk_category1 foreign key ( parentcategory )
  6      references category ( curcategory )
  7  );

Table created.

SQL> create table article (
  2    name          varchar2(20),
  3    artcategory   varchar2(20),
  4    constraint pk_article primary key ( name ),
  5    constraint fk_artcategory foreign key ( artcategory )
  6      references category ( curcategory )
  7  );

Table created.

Некоторые примеры данных:

SQL> select * from category;

CURCATEGORY          PARENTCATEGORY
-------------------- --------------------
clothes
trousers             clothes
shirts               clothes

SQL> select * from article;

NAME                 ARTCATEGORY
-------------------- --------------------
t-shirt              shirts
a-shirt              shirts
jeans                trousers

SQL>

В соответствии с этим иерархия должна выглядеть следующим образом:

clothes
  shirts
    t-shirt
    a-shirt
  trousers
    jeans

ОК, давайте сделаем это так.

Из двух таблиц, используя условие факторизации WITH (т. Е. CTE, общее табличное выражение), я ОБЪЕДИНЯЮ эти две таблицы, чтобы создать один родительский-дочерний источник.Тогда написание иерархического запроса является простым делом.

SQL> with source as
  2    (select c.parentcategory parent, c.curcategory child
  3     from category c
  4     union
  5     select a.artcategory parent, a.name child
  6     from article a
  7    )
  8  select lpad(' ', 2 * level - 1) || child clothes
  9  from source
 10  start with parent is null
 11  connect by prior child = parent
 12  order siblings by child;

CLOTHES
------------------------------------------------------------
 clothes
   shirts
     a-shirt
     t-shirt
   trousers
     jeans

6 rows selected.

SQL>
...