Recursividade no SQL

6 respostas
E

Estou com seguinte problema:
Tenho aqui uma tela de cadastros onde cada cadastro possui itens e, em alguns casos, estes itens podem estar asssociados a outros cadastros. Porem preciso obter todos os itens associados diretamente ou indiretamente(os itens que são cadastros contem outros itens) que não são cadastros. Então preciso fazer uma busca recursiva no sql. Se alguem puder ajudar agradeço.

6 Respostas

yorgan

Bom, pelo que entendi do seu caso, uma clausula where que relacione os itens já resolveria o seu problema.
Se precisar de ajuda nela, poste a estrutura das tabelas que quer relacionar que fica mais facil para ajudar.

[]´s

Daniel

E

Aqui esta a estrutura das 3 tabelas envolvidas

DROP TABLE IF EXISTS `produto`; CREATE TABLE `produto` ( `cd_produto` int(10) unsigned NOT NULL auto_increment, `ds_referencia` varchar(25) NOT NULL default '', `ds_descricao` text NOT NULL, PRIMARY KEY (`cd_produto`), ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `itemproduto`; CREATE TABLE `itemproduto` ( `cd_itemproduto` int(10) unsigned NOT NULL auto_increment, `nr_quantidade` decimal(20,8) unsigned NOT NULL default '0.00000000', `cd_produto` int(10) unsigned NOT NULL default '0', ## relaciona com a tabela principal `cd_produtoitem` int(10) unsigned NOT NULL default '0', ## relaciona qual produto é item do produto principal PRIMARY KEY (`cd_itemproduto`), KEY `FK_itemproduto_produto` (`cd_produto`), CONSTRAINT `FK_itemproduto_produto` FOREIGN KEY (`cd_produto`) REFERENCES `produto` (`cd_produto`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `itemprodutomaterial`; CREATE TABLE `smartorc`.`itemprodutomaterial` ( `cd_itemprodutomaterial` int(10) unsigned NOT NULL auto_increment, `nr_quantidade` decimal(20,8) unsigned NOT NULL default '0.00000000', `cd_material` int(10) unsigned NOT NULL default '0', `cd_produto` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`cd_itemprodutomaterial`), KEY `FK_itemprodutomaterial_produto` (`cd_produto`), CONSTRAINT `FK_itemprodutomaterial_produto` FOREIGN KEY (`cd_produto`) REFERENCES `produto` (`cd_produto`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Se poderes me ajudar, pois somente com a condição where não consegui.
Agradeço desde já a ajuda.

yorgan

Só me confirme se isso que você quer: Você quer a lista de “itemproduto” e “itemprodutomaterial” que estejam vinculados a um produto, é isso?
Se for, acho que um select assim resolveria:

SELECT * //ou as colunas que desejar
       FROM produto p,
                itemproduto ip,
                itemprodutomaterial ipm
    WHERE p.cd_produto = ip.cd_produto
        AND p.cd_produto = ipm.cd_produto
        AND p.cd_produto = ? //aqui você lança o codigo do produto que deseja trazer os dados

Se não for isso, explique melhor o que deseja que a consulta traga…e quais valores você vai lançar na clausula WHERE

[]´s

Daniel

E

Preciso obter todos os materiais que estão relacionados com o produto.
Tipo:
Produto P
ItemProduto IP
ItemProdutoMaterial IPM

P
  IP		  IPM
IP	       IPM

IP IPM

Preciso pegar todos os ItemProdutoMaterial que estão associados diretamente e indiretamente com o produto,
para então obter os materiais que o produto utiliza.

yorgan

mas o comando SQL que eu passei não monta o que você quer?

[]s´

Daniel

E

Não, é que preciso dos materiais que estão dentro dos itemProduto, com este select ele só associa o produto com seus itens que estão no nivel 1 de hierarquia.
Preciso pegar tambem os materiais desses ItemProduto e se este ItemProduto tiver é um produto que contem mais itemProduto então preciso deste materiais tambem.
EX:
Produto possui ItemProduto1 E ItemProdutoMaterial 1
ItemProduto1 possui ItemProduto2 e ItemProdutoMaterial 2
ItemProduto2 possui ItemProduto3
ItemProduto3 possui ItemProdutoMaterial 3

E assim por diante até conseguir pegar todos os ItemProdutoMaterial para depois fazer um join com materiais para ter os materiais que fazem parte deste produto.

Criado 16 de outubro de 2008
Ultima resposta 16 de out. de 2008
Respostas 6
Participantes 2