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:
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
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.