Em 06/09/08, Adenilton B. da Silva<[EMAIL PROTECTED]> escreveu:
> Bom dia,
>
> Em primeiro lugar peço desculpas pelo longo email que abaixo segue.
>
> Dei uma pesquisada no nabble e também no google e não achei muita coisa a
> respeito, preciso implementar uma consulta recursiva em PostgreSQL e venho a
> recorrer aos gurus desta lista.
>
> Estou utilizando o PostgreSQL versão 8.3.3 no Windows XP SP3.
>
> Tenho as seguintes tabelas como exemplo:
>
> CREATE TABLE foo1(  codigo serial NOT NULL,  descricao character
> varying(30),  qtde integer NOT NULL,  preco numeric(13,3),  CONSTRAINT
> foo1_pkey PRIMARY KEY (codigo))
>
> CREATE TABLE foo2(  codigo serial NOT NULL,  caracteristica character
> varying(20),  CONSTRAINT foo2_pkey PRIMARY KEY (codigo))
>
> CREATE TABLE foo3(  codigo serial NOT NULL,  codfoo2 integer,  desccaract
> character varying(30),  codfoo1 integer,  qtde integer,  preco
> numeric(13,3),  CONSTRAINT foo3_pkey PRIMARY KEY (codigo))
>
> Populei elas da seguinte forma:
>
> INSERT INTO FOO1 (DESCRICAO, QTDE, PRECO) VALUES ('PRODUTO 1', 11, 25);
> INSERT INTO FOO1 (DESCRICAO, QTDE, PRECO) VALUES ('PRODUTO 2', 22, 30);
> INSERT INTO FOO1 (DESCRICAO, QTDE, PRECO) VALUES ('PRODUTO 3', 33, 19);
> INSERT INTO FOO1 (DESCRICAO, QTDE, PRECO) VALUES ('PRODUTO 4', 44, 25);
>
> INSERT INTO FOO2 (CARACTERISTICA) VALUES ('COR');
> INSERT INTO FOO2 (CARACTERISTICA) VALUES ('TAMANHO');
> INSERT INTO FOO2 (CARACTERISTICA) VALUES ('MODELO');
>
> INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE, PRECO) VALUES (1,
> 'AZUL', 1, 3, 35);
> INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE, PRECO) VALUES (1,
> 'PRETA', 1, 5, 23);
> INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE, PRECO) VALUES (1,
> 'MARROM', 1, 8, 28);INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE,
> PRECO) VALUES (1, 'CINZA', 1, 6, 54);
> INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE, PRECO) VALUES (1,
> 'BRANCA', 4, 2, 21);
> INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE, PRECO) VALUES (1,
> 'VERDE', 4, 8, 45);
> INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE, PRECO) VALUES (2,
> 'MEDIO', 4, 9, 29);
> INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE, PRECO) VALUES (1,
> 'AMARELA', 1, 5, 15);
> INSERT INTO FOO3 (CODFOO2, DESCCARACT, CODFOO1, QTDE, PRECO) VALUES (3,
> 'JEANS', 1, 3, 12);
>
> Numa tentativa de agrupar os resultados criei a seguinte view:
>
> CREATE OR REPLACE VIEW vfoo AS  SELECT f.codigo, f.descricao,
> h.caracteristica, g.desccaract, f.preco AS precofo01, f.qtde AS qtdefoo1,
> g.qtde AS qtdefoo3, g.preco AS precofo03   FROM foo1 f   LEFT JOIN foo3 g ON
> f.codigo = g.codfoo1   LEFT JOIN foo2 h ON h.codigo = g.codfoo2;
>
> Que agrupou uma parte dos dados, e em seguida para trazer as quantidades e
> os preços de cada item que não possuem hierarquia fiz essa outra view:
>
> CREATE OR REPLACE VIEW vfoo1 AS  SELECT vfoo.codigo, vfoo.descricao,
> vfoo.caracteristica, vfoo.desccaract, vfoo.qtdefoo3, vfoo.precofo03 AS preco
>   FROM vfoo  WHERE vfoo.caracteristica::text <> ''::textUNION  SELECT
> vfoo.codigo, vfoo.descricao, vfoo.caracteristica, vfoo.desccaract,
> vfoo.qtdefoo1 AS qtdefoo3, vfoo.precofo01 AS preco   FROM vfoo  WHERE
> vfoo.caracteristica IS NULL  ORDER BY 2;
> Esta por sua vez traz todos os dados que quero, mas não da forma como desejo
> visualizar, vejamos o retorno dessa view e a forma como desejo os
> resultados:
>
> Retorno da view:
>
> CODIGO  DESCRICAO     CARACTERISTICA  DESCCART     QTDEFOO3 PRECO
> 1             "PRODUTO 1"   "COR"                   "AMARELA"       5
>      15.000
> 1             "PRODUTO 1"   "COR"                   "AZUL"               3
>           35.000
> 1             "PRODUTO 1"   "COR"                   "CINZA"             6
>          54.000
> 1             "PRODUTO 1"   "COR"                   "MARROM"       8
>     28.000
> 1             "PRODUTO 1"   "COR"                   "PRETA"             5
>          23.000
> 1             "PRODUTO 1"   "MODELO"         "JEANS"                3
>      12.000
> 2             "PRODUTO 2"   ""                           ""
>      22           30.000
> 3             "PRODUTO 3"   ""                           ""
>      33           19.000
> 4             "PRODUTO 4"   "COR"                   "BRANCA"          2
>        21.000
> 4             "PRODUTO 4"   "COR"                   "VERDE"             8
>          45.000
> 4             "PRODUTO 4"   "TAMANHO"     "MEDIO"                9
>   29.000
>
>
> Retorno desejado:
>
> ALGO PARECIDO COM:
>
> Podemos descartar os codigos e montar a estutura da seguinte forma:
>
> PRODUTO1
>    COR AMARELA 5 15.000  -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA
> COLUNA.
>    COR AZUL 5 35.000  -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA COLUNA.
>    COR CINZA 6 54.000   -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA
> COLUNA.
>    COR MARROM 8 28.000   -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA
> COLUNA.
>    COR PRETA 5 23.000   -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA
> COLUNA.
>    MODELO JEANS  3 12.000   -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA
> COLUNA.
> PRODUTO 2
> PRODUTO 3
> PRODUTO 4
>    COR BRANCA 2 21.000   -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA
> COLUNA.
>    COR VERDE 8 45.000   -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA
> COLUNA.
>    TAMANHO MEDIO 9 29.000   -- NOTEM QUE ESTE RESULTADO PODE SER UMA UNICA
> COLUNA.
>
>
>
> Se precisarem de alguma outra informação para complemento destas
> informações, não hesitem em pedir.
>


Você poderia indicar onde deseja a recursividade pois não consegui identificar.
Me parece uma simples questão de junção e não de recursividade.

Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a