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.
Recursividade no SQL
6 Respostas
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
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.
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
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.
mas o comando SQL que eu passei não monta o que você quer?
[]s´
Daniel
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.