Fórum Select retornando resultados infinitos. #499550

29/10/2014

0

Bom dia, pessoal!

Criei um select para comparar dados entre tabelas retornar apenas os valores da busca executada, porem o result é catastrófico, retorna sempre mais de 30 mil linhas.


SELECT it.cd_ord_com               CODIGO_SOLICITACAO_COMPRA
       ,oc.cd_ord_com             CODIGO_ORDEM_COMPRA
       ,it.cd_produto             CODIGO_PRODUTO
       ,po.ds_produto             DESCRICAO_PRODUTO
       ,un.ds_unidade             DESCRICAO_UNIDADE
       ,oc.cd_fornecedor          CODIGO_FORNECEDOR
       ,fr.nm_fantasia            NOME_FANTASIA
       ,ic.ds_marca               DESCRICAO_MARCA
       ,ic.qt_cotada              QUANTIDADE_COTADA
       ,ic.vl_unitario            VALOR_UNITARIO
       ,sc.tp_sol_com             TIPO_SOLITACAO_COMPRA
       ,sc.tp_situacao            SITUACAO_TIPO



FROM itord_pro it,
itsol_com io,
produto po,
uni_pro un,
for_com fo,
fornecedor fr,
itcol_pro ic,
sol_com sc,
ord_com oc,
coleta ct


where sc.tp_situacao in ('P','F')
and sc.tp_sol_com = 'P'
and it.cd_produto = po.cd_produto
and oc.cd_fornecedor = fo.cd_fornecedor
and ct.cd_coleta = ic.cd_coleta
and ct.cd_fornecedor = fr.cd_fornecedor
and un.cd_uni_pro = ic.cd_uni_pro
and ic.cd_produto = po.cd_produto
and it.cd_ord_com = oc.cd_ord_com
Lucas Perin

Lucas Perin

Responder

Posts

29/10/2014

Jair N.

Boa Tarde pelo que pude ver a tabela "itsol_com" (io) você fez este sem um relacionamento do tipo junção cruzada (cross-join)! reveja isto...
(relacionamento de tudo para todos...).
Responder

Gostei + 0

29/10/2014

Lucas Perin

Inseri o relacionamento, completando e continua me dando 180mil registros. :(
Responder

Gostei + 0

29/10/2014

Marisiana Battistella

Lucas, você sabe utilizar o padrão ANSI (left join, inner join, right join) ?
Aconselho a utilizar, pois facilita muito mais a compreensão do SQL, evita o uso de JOIN errados, além de melhorar a performance do SQL.
Responder

Gostei + 0

29/10/2014

Lucas Perin

Marisiana, sei utilizar sim porem a questão é...preciso "juntar" 9 tabelas.
Responder

Gostei + 0

29/10/2014

Jair N.

Olha só, tá faltando muita coisa a ser relacionada ai a exemplo também a tabela "sol_com" (sc) veja que você fez o filtro por "situacao" e "tp_sol_com" mas não se relaciona com nenhuma outra, outro caso de CROSS JOIN... agora veja também que a maioria só tem um relacionamento quando deveria ter muito mais a exemplo: "tp_sol_com","tp_sol_com","ord_com" ... reveja faça um relacionamento de cada vêz pegue a tabela principal, relaciona um, veja o resultado, relaciona mais um... porque do jeito que tá vai ter muito trabalho para ficar acertando, não adianta pressa, pois o resultado que você ta tendo é devido a "junção cruzada" conforme já informei...

Atc.
Responder

Gostei + 0

29/10/2014

Marisiana Battistella

Mas o número de tabelas que vc terá que utilizar não te impede de utilizar o padrão ANSI, quanto mais tabelas envolvidas maior a necessidade de uso dele.
É pelos motivos que o Jair descreveu que você deve utilizar o padrão ANSI.
Você utilizou 10 tabelas na cláusula FROM e na claúsula WHERE você fez 7 JOIN ligando essas tabelas...
Responder

Gostei + 0

29/10/2014

Marisiana Battistella

Veja como ficará +ou- a estrutura do SQL se você utilizar o padrão ANSI:
SELECT it.cd_ord_com  as CODIGO_SOLICITACAO_COMPRA, 
       oc.cd_ord_com  as CODIGO_ORDEM_COMPRA,
       it.cd_produto  as CODIGO_PRODUTO,
       po.ds_produto  as DESCRICAO_PRODUTO,
       un.ds_unidade  as DESCRICAO_UNIDADE,
       oc.cd_fornecedor  as CODIGO_FORNECEDOR,
       fr.nm_fantasia  as NOME_FANTASIA,
       ic.ds_marca as DESCRICAO_MARCA,
       ic.qt_cotada as QUANTIDADE_COTADA,
       ic.vl_unitario as VALOR_UNITARIO,
       sc.tp_sol_com as TIPO_SOLITACAO_COMPRA,
       sc.tp_situacao as SITUACAO_TIPO
FROM itord_pro it
join itsol_com io
on  ----- incluir join
join produto po
on it.cd_produto = po.cd_produto
join for_com fo
on ------ incluir join
join fornecedor fr
on  ------ incluir join
join itcol_pro ic
on ic.cd_produto = po.cd_produto
join uni_pro un
on un.cd_uni_pro = ic.cd_uni_pro
join sol_com sc
on --- incluir join
join ord_com oc
on oc.cd_fornecedor = fo.cd_fornecedor
and it.cd_ord_com = oc.cd_ord_com
join coleta ct
on ct.cd_coleta = ic.cd_coleta 
and ct.cd_fornecedor = fr.cd_fornecedor
 
where sc.tp_situacao in ('P','F')
and sc.tp_sol_com = 'P'


Você deve ver quais são os relacionamentos entre essas tabelas e referenciá-las corretamente nos JOINs.
Responder

Gostei + 0

21/11/2014

Marisiana Battistella

Lucas, você conseguiu encontrar a solução?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar