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.
 
Desde já grato pelo atendimento a esta demanda,
 

ADENILTON Batista da Silva          Index Informática LTDA  
-----------------------------   (79)3431-3234 / 9142-0886  [EMAIL PROTECTED] 
www.indexinformatica.com.br
_________________________________________________________________
Conheça o Windows Live Spaces, a rede de relacionamentos do Messenger!
http://www.amigosdomessenger.com.br/
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a