. . . .
Sumário Introdução
,230 0 00 0 0,
O Elefante arborícola
Consultas recursivas com expressões comuns de tabelas
Leandro Guimarães Faria Corcete Dutra
1Comunidade Brasileira de PostgreSQL 2ArsData
III Conferência brasileira de PostgreSQL (2009)
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
. . . . Sumário Introdução
Besteirol
I NoSQL I SGBDs OO I SGBDs multivalorados I Prevayler I LDAP I …Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Besteirol
I NoSQL I SGBDs OO I SGBDs multivalorados I Prevayler I LDAP I …. . . . Sumário Introdução
Besteirol
I NoSQL I SGBDs OO I SGBDs multivalorados I Prevayler I LDAP I …Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Besteirol
I NoSQL I SGBDs OO I SGBDs multivalorados I Prevayler I LDAP I …. . . . Sumário Introdução
Besteirol
I NoSQL I SGBDs OO I SGBDs multivalorados I Prevayler I LDAP I …Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Besteirol
I NoSQL I SGBDs OO I SGBDs multivalorados I Prevayler I LDAP I …. . . .
Sumário Introdução
Problemas aparentes
I Dificuldade de aprendizado
I Não OO
I Não parecido com C, Java &c
I Computacionalmente incompleto
I Não lidar com dados ‘ricos’ ou ‘desestruturados’
I Não lidar com hierarquias
I …
I Mentiras! :-)
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Problemas aparentes
I Dificuldade de aprendizado
I Não OO
I Não parecido com C, Java &c
I Computacionalmente incompleto
I Não lidar com dados ‘ricos’ ou ‘desestruturados’
I Não lidar com hierarquias
I …
. . . .
Sumário Introdução
Problemas aparentes
I Dificuldade de aprendizado
I Não OO
I Não parecido com C, Java &c
I Computacionalmente incompleto
I Não lidar com dados ‘ricos’ ou ‘desestruturados’
I Não lidar com hierarquias
I …
I Mentiras! :-)
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Problemas aparentes
I Dificuldade de aprendizado
I Não OO
I Não parecido com C, Java &c
I Computacionalmente incompleto
I Não lidar com dados ‘ricos’ ou ‘desestruturados’
I Não lidar com hierarquias
I …
. . . .
Sumário Introdução
Problemas aparentes
I Dificuldade de aprendizado
I Não OO
I Não parecido com C, Java &c
I Computacionalmente incompleto
I Não lidar com dados ‘ricos’ ou ‘desestruturados’
I Não lidar com hierarquias
I …
I Mentiras! :-)
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Problemas aparentes
I Dificuldade de aprendizado
I Não OO
I Não parecido com C, Java &c
I Computacionalmente incompleto
I Não lidar com dados ‘ricos’ ou ‘desestruturados’
I Não lidar com hierarquias
I …
. . . .
Sumário Introdução
Problemas aparentes
I Dificuldade de aprendizado
I Não OO
I Não parecido com C, Java &c
I Computacionalmente incompleto
I Não lidar com dados ‘ricos’ ou ‘desestruturados’
I Não lidar com hierarquias
I …
I Mentiras! :-)
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Problemas aparentes
I Dificuldade de aprendizado
I Não OO
I Não parecido com C, Java &c
I Computacionalmente incompleto
I Não lidar com dados ‘ricos’ ou ‘desestruturados’
I Não lidar com hierarquias
I …
. . . .
Sumário Introdução
Falsos problemas
I Forma mais simples já imaginada de lidar com dados
I Modelo relacional é ortogonal com OO
I SQL não é única implementação relacional possível
I Dados ricos ou desetruturados são ortogonais (tipos)
I SQL é computacionalmente completo desde o ISO SQL:2008…
I …e o PostgreSQL, desde a versão 8.4…
I …graças à recursividade (SQL99) e funções de janela
I Recursividade nos dá hierarquia, grafos &c!
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Falsos problemas
I Forma mais simples já imaginada de lidar com dados
I Modelo relacional é ortogonal com OO
I SQL não é única implementação relacional possível
I Dados ricos ou desetruturados são ortogonais (tipos)
I SQL é computacionalmente completo desde o ISO SQL:2008…
I …e o PostgreSQL, desde a versão 8.4…
I …graças à recursividade (SQL99) e funções de janela
. . . .
Sumário Introdução
Falsos problemas
I Forma mais simples já imaginada de lidar com dados
I Modelo relacional é ortogonal com OO
I SQL não é única implementação relacional possível
I Dados ricos ou desetruturados são ortogonais (tipos)
I SQL é computacionalmente completo desde o ISO SQL:2008…
I …e o PostgreSQL, desde a versão 8.4…
I …graças à recursividade (SQL99) e funções de janela
I Recursividade nos dá hierarquia, grafos &c!
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Falsos problemas
I Forma mais simples já imaginada de lidar com dados
I Modelo relacional é ortogonal com OO
I SQL não é única implementação relacional possível
I Dados ricos ou desetruturados são ortogonais (tipos)
I SQL é computacionalmente completo desde o ISO SQL:2008…
I …e o PostgreSQL, desde a versão 8.4…
I …graças à recursividade (SQL99) e funções de janela
. . . .
Sumário Introdução
Falsos problemas
I Forma mais simples já imaginada de lidar com dados
I Modelo relacional é ortogonal com OO
I SQL não é única implementação relacional possível
I Dados ricos ou desetruturados são ortogonais (tipos)
I SQL é computacionalmente completo desde o ISO SQL:2008…
I …e o PostgreSQL, desde a versão 8.4…
I …graças à recursividade (SQL99) e funções de janela
I Recursividade nos dá hierarquia, grafos &c!
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Falsos problemas
I Forma mais simples já imaginada de lidar com dados
I Modelo relacional é ortogonal com OO
I SQL não é única implementação relacional possível
I Dados ricos ou desetruturados são ortogonais (tipos)
I SQL é computacionalmente completo desde o ISO SQL:2008…
I …e o PostgreSQL, desde a versão 8.4…
I …graças à recursividade (SQL99) e funções de janela
. . . .
Sumário Introdução
Falsos problemas
I Forma mais simples já imaginada de lidar com dados
I Modelo relacional é ortogonal com OO
I SQL não é única implementação relacional possível
I Dados ricos ou desetruturados são ortogonais (tipos)
I SQL é computacionalmente completo desde o ISO SQL:2008…
I …e o PostgreSQL, desde a versão 8.4…
I …graças à recursividade (SQL99) e funções de janela
I Recursividade nos dá hierarquia, grafos &c!
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Falsos problemas
I Forma mais simples já imaginada de lidar com dados
I Modelo relacional é ortogonal com OO
I SQL não é única implementação relacional possível
I Dados ricos ou desetruturados são ortogonais (tipos)
I SQL é computacionalmente completo desde o ISO SQL:2008…
I …e o PostgreSQL, desde a versão 8.4…
I …graças à recursividade (SQL99) e funções de janela
. . . .
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
I Recursividade: expressões comuns de tabelas.
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
. . . .
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
I Recursividade: expressões comuns de tabelas.
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
. . . .
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
I Recursividade: expressões comuns de tabelas.
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
. . . .
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
I Recursividade: expressões comuns de tabelas.
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
. . . .
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
I Recursividade: expressões comuns de tabelas.
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
. . . .
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
I Recursividade: expressões comuns de tabelas.
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
. . . .
Sumário Introdução
Soluções para hierarquias‽
I Processamento externo
I Caro em recursos — escalabilidade
I Não relacional
I Enumeração de caminhos materializados
I Funções & procedimentos armazenados
I Conjuntos aninhados (nested sets)
I Caro na escrita
I Complicado
I Estúpido
I Oracle CONNECT BY
I Antigo, e implementado no contrib
I Incomum, e obsoleto no Oracle 11gr2
I Recursividade: expressões comuns de tabelas.
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Recursividade
I Solução correta para o problema da hierarquia
I Solução genérica: grafos &c
I Interessante: conjuntos de Mandelbrot, caixeiro�viajante &c
I Relacional (na medida do possível em SQL)
. . . .
Sumário Introdução
Recursividade com expressões comuns de tabelas
I Padrão ISO SQL:1999
I prenunciado como a solução desde 1997 ao menos
I relacional, ao menos em espírito e na prática
I veloz, econômico…
I e (relativamente) simples
I ISO SQL, Yoshiyuki Asaba, Ishii Tatsuo, Jeff Davis,
Gregory Stark, Tom Lane, David Fetter, comunidade japonesa
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Expressões de tabelas: WITH
WITH a p e l i d o ( l i s t a _ a t r i b u t o s ) AS ( c o n s u l t a ) [ , … ] SELECT l i s t a _ p r o j e ç ã o
FROM a p e l i d o [ , … ] …
A ordem em que aparecem os apelidos é essencial. Uma tabela para o exemplo: CREATE TABLE p e d i d o s ( r e g i ã o , p r o d u t o , v a l o r ,
. . . .
Sumário Introdução
WITH v e n d a s _ r e g i ã o AS
(SELECT r e g i ã o , SUM ( montante ) AS t o t a i s FROM p e d i d o s
GROUP BY r e g i ã o ) , m e l h o r e s _ r e g i õ e s AS (SELECT r e g i ã o
FROM v e n d a s _ r e g i ã o
WHERE t o t a i s > (SELECT SUM( t o t a i s ) / 1 0 FROM v e n d a s _ r e g i ã o ) ) SELECT r e g i ã o , p r o d u t o , SUM( q u a n t i d a d e ) AS u n i d a d e s , SUM( montante ) AS v a l o r FROM p e d i d o s WHERE r e g i ã o IN (SELECT r e g i ã o FROM m e l h o r e s _ r e g i õ e s ) GROUP BY r e g i ã o , p r o d u t o ;
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Mecanismo de recursão
I Condição inicial
I Passo de recursão (consulta)
I Condição terminal
Se não…
I GNU Hurd
I Gnu Não é Unix
. . . .
Sumário Introdução
Expressões recursivas de tabelas
WITH RECURSIVE a p e l i d o [ ( a t r i b u t o s ) ] AS ( t e r m o _ n ã o _ r e c u r s i v o UNION [ ALL ] t e r m o _ r e c u r s i v o ) c o n s u l t a ;
Leandro Guimarães Faria Corcete Dutra PostgreSQL BR, ArsData O Elefante arborícola
Sumário Introdução
Exemplo simplicíssimo, do manual
WITH RECURSIVE t ( n ) AS (VALUES ( 1 ) UNION ALL SELECT n + 1 FROM t WHERE n < 100 ) SELECT SUM ( n ) FROM t ;