GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Encontrar documento que originou os seguintes

Tenho uma tabela em que um documento pode originar novos documentos, e este novo documento carrega em uma coluna o número do documento originador(não necessariamente o primeiro documento que existiu).

Pode haver diversos documentos depois do originador, mas preciso encontrar sempre o primeiro documento.
No exemplo o documento 112 gerou o 117, que gerou o 119, que gerou o 120, que gerou o 121, mas o originador de tudo, é o 112.

Anexei imagem para tentar deixar mais claro o que desejo fazer.

Desejado:

inserir a descrição da imagem aqui

http://sqlfiddle.com/#!18/806e15

Agradeço se puderem ajudar.
Inclusive sobre o título da pergunta, não consegui pensar em algo melhor. Aceito críticas para poder deixar mais coerente com a necessidade.

O que você quer fazer é caminhar na tabela como se ela fosse uma árvore. Essa é uma das estruturas de dados que são meio cornas de representar em tabelas de RDBMS, mas dá pra fazer.

Dependendo do volume de transações, talvez seria mais interessante usar um banco de dados de grafo ou orientado a documentos.

Mas enfim, respondendo sua dúvida, tem um negócio chamado “common table expressions” que permite que você faça essa query. O que você quer é uma query recursiva. Eu não sei a sintaxe de cabeça e muda um pouco de banco pra banco. Pesquisa isso no google:

“Common Table Expressions Recursive SQL Query <nome do banco que vc tá usando>”

Por exemplo, pro Postgres

Boa sorte

Fiz um exemplo aqui com o que vc mandou: http://sqlfiddle.com/#!18/806e15/16

Usando isso aqui como base: https://www.sqlservertutorial.net/sql-server-basics/sql-server-recursive-cte/

Era isso que vc queria?

1 Curtida

Então, está bem no caminho da necessidade, valeu pelo exemplo e dicas. Aparentemetne algumas “linhas” retornam duplicadas, fiz este exemplo usando seu código e fiz as observações.
http://sqlfiddle.com/#!18/0f1d9/1

Sucesso então. Os duplicados são por causa do union all. Pelo que entendi é sua responsabilidade lidar com duplicatas em seguida (após a query recursiva).

O Postgres implementa essa funcionalidade e pra usar é só usar union ao invés de union all, mas parece que o SQL Server não implementa.

Estou indo agora num lugar que não vou ter internet, mas vou trabalhar em cima do seu exemplo. E vou postando os avanços. Coloquei “só pra ver” um Distinct,e aparentemente não teve duplicatas. A query “real” mesmo, é muito mais complicada e mais extensa, mas eu dependia de encontrar o documento_original pra poder andar.

//