sysbase sql запросить дерево - PullRequest
       23

sysbase sql запросить дерево

0 голосов
/ 11 ноября 2011

Я видел много ответов на этот вопрос, но я до сих пор не могу понять, как это сделать. Я использую Sybase. Но я предпочитаю стандартный ответ SQL.

У меня есть таблица, которая образует множество древовидных структур. Я хотел бы получить список всех дочерних узлов с учетом набора родительских узлов. Например, возьмите таблицу ниже

parent     child
AA          AAB
AA          AAC
AAB         AABA
AAB         AABB
AAB         AABC
AAB         AABD
AAB         AABE
AAB         AABF
AABB        AABBC
AABB        AABBA
AABB        AABBB
AABB        AABBC
BB          BBA
BB          BBB
BBB         BBBA

так что в основном я хочу запрос, который, учитывая входные данные AA и BB, дал бы мне все записи выше. Предположим, что приведенное выше является структурой каталогов, результат похож на то, что я получаю все подкаталоги рекурсивно одного или нескольких корневых.

Как я уже сказал, я видел вопрос, который задавали много раз, но все же я не мог найти ответ, который мог бы использовать. Было несколько ссылок на посторонние статьи, я прочитал 3 или 4, но я думаю, что не могу перевести это на SQL. (Мой опыт sql немного ржавый).

спасибо

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Есть много решений для этого вопроса, у каждого есть свои преимущества и недостатки, и там не идеал. Это зависит от ваших задач.

Одним из таких решений является закрытие перехода (http://en.wikipedia.org/wiki/Transitive_closure).

Преимущество - очень простые запросы и производительность.

Недостатки - сложность в обслуживании и большой объем из-за денормализации.

F.e. это две таблицы узлов и переходов. \ Первая таблица очевидна, а вторая должна содержать ALL дочерний элемент EVERY . Сам узел должен включать узел с нулевым уровнем.

create table Node (
   node_id              integer                        not null,
   name                 varchar(255)                   null,
   constraint PK_NODE primary key (node_id)
)
go
create table Transition (
   node_id              integer                        null,
   child_id             integer                        null,
   levl                 integer                        null
)
go

Lvl - уровень является полезным столбцом во многих запросах.

Например, вы можете получить все дочерние элементы любого узла простым запросом:

select 
  c.node_id,
  c.name 
from
  Transition t,
  Node c
where 
  t.node_id = :id
and t.child_id = c.node_id
and lvl > 0

Конечно, вы должны создать хранимую процедуру или триггер для заполнения и обслуживания таблицы переходов.

Существуют и другие решения (менее дорогие по объему, но более сложные для обновления), но вы можете начать с этого.

Другие СУБД, такие как Oracle, имеют встроенную поддержку запросов дерева (соединяются по пути f.e.), но этот тип запроса имеет ОЧЕНЬ плохую производительность для больших таблиц.

0 голосов
/ 11 ноября 2011

Я так понял, вам нужен запрос для этой таблицы.

Итак, вам нужно сделать что-то вроде этого:

select distinct parent, child from table
where parent like '%AA%'
OR parent like '%BB%'

Если это не то, что вам нужноПожалуйста, оставьте комментарий:)

...