Синтаксис выглядит как 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>