o SQL do sysbase pesquisa uma árvore

Vi muitas respostas para esta pergunta, mas ainda não sei como fazê-lo. Estou a usar a Sybase. Mas prefiro uma resposta SQL padrão.

Tenho uma tabela que forma uma série de estruturas de árvores. Eu gostaria de obter a lista de todos os nós filhos dado um conjunto de nós pais. Por exemplo, tome o quadro abaixo

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

então, basicamente, eu quero uma consulta que, dada a entrada AA e BB, me daria todas as entradas acima. Suponha que o acima é uma estrutura de diretório, o resultado é semelhante para me obter todas as subdiretórios recursivamente de uma de mais raiz.

Como disse, Vi a pergunta tantas vezes, mas mesmo assim não encontrei uma resposta que pudesse usar. Havia alguns links para artigos externos, eu li 3 ou 4, mas acho que não posso traduzir isso para SQL. (Minha experiência sql está enferrujada um pouco).

Obrigado

Author: Charbel, 2011-11-11

2 answers

Existem muitas soluções para esta questão, cada uma tem as suas vantagens e desvantagens, e não há o ideal. Depende das tuas tarefas. Uma destas soluções é o encerramento da transição (http://en.wikipedia.org/wiki/Transitive_closure). Vantagem: consultas e desempenho muito simples.

Desvantagens - difícil de manter e grande volume devido à desnormalização.

F. e. Os nós são duas tabelas e transições. \ A primeira tabela é óbvia e o segundo deve conter all child of EVERY node include node themself with level zero.

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

O nível Lvl é uma coluna útil em muitas consultas.

Por exemplo, você pode obter todas as crianças em qualquer nó com consulta simples:

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

É claro que tem de criar um procedimento ou gatilho armazenado para preencher e manter a tabela de transição.

Existem outras soluções (menos dispendiosas em volume, mas mais difíceis de actualizar) mas pode começar com isto um.

Outros RDBMS, como o Oracle, construíram no suporte de consultas em árvore (ligar pela path F. E.), mas este tipo de consulta tem Muito mau desempenho em tabelas grandes.

 1
Author: kolchanov, 2011-11-11 11:46:04

É que eu entendi, você só quer a consulta para aquela tabela.

Então, vais ter de fazer uma coisa destas.
select distinct parent, child from table
where parent like '%AA%'
OR parent like '%BB%'

Se não é disto que precisa, por favor faça um comentário:)

 0
Author: aF., 2011-11-11 14:52:24