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