Problema com SELECT

5 respostas
R

Olá pessoal,
estou com uma dúvida neste select aninhado

select txt_tp_logradouro, txt_logradouro, nro_logradouro, txt_complemento, nro_cep, nro_telefone_1, nro_telefone_2 
from 
(
  select txt_tp_logradouro from tipo_logradouro
), endereco

Na verdade o que eu gostaria é que o resultado select interno (select txt_tp_logradouro from tipo_logradouro) fosse cruzado com a tabela “endereco”, porém não é o que está ocorrendo. Ao invés disso os resultado são concatenados. Ou seja, ele existe uma tabela ao lado da outra no resultado, efetuando consultas separadas. Existe alguma forma de cruzar esses dados usando blocos de selects diferentes?
Desde já agradeço pela atenção.

Att,
Regis

5 Respostas

wagner_a_lima

Posta ai a estrutura de suas tabelas, pra vermos os relacionamentos.

R

Olá é bem simples, a tabela “tipo_logradouro” tem uma pk int_tp_logradouro e um texto txt_tp_logradouro e o endereço tem uma pk NRO_INT_ENDERECO, uma fk nro_logradouro e informações sobre o endereço txt_complemento, nro_cep, nro_telefone_1, nro_telefone_2.

A minha única dúvida é se há algum suporte da sql para que eu possa cruzar informações dividindo as consultas (SELECTS). Ao inves de fazer vários INNER JOINS entre várias tabelas eu quero fazer os selects separadamente filtrando as queries e depois cruza. Esse exemplo é apenas para demonstrar o que eu quero, pois o que eu tenho na verdade é o cruzamento de 8 tabelas com INNER JOIN o que está fazendo a consulta muito demorada. Se eu puder dividir esses cruzamentos em selects individuais, filtrar, e depois cruzar eu tenho um ganho (Estratégia Dividir para Conquistar), no entanto ainda não achei esse suporte na sql.

Agradeço pela ajuda.

Att,
Regis

drigo.angelo

Opa, bom dia cara!

Eu achei meio estranho essa consulta sua… geralmente não são feitas subConsultas na cláusula FROM

Qual SGBD tá utilizando?

Ps, Para fazer correlação, voce não declara a tabela de novo, tipo

SELECT a.campo_tab_1, a.campo_2_tab_1, b.campo_tab_2, (SELECT c.campo_tab_3 FROM tab_3 c WHERE c.codigo = a.codigo) -- correlação com tabela "a" ) FROM tab_1 a, tab_2 b WHERE ...
Não sei se ficou claro, mas nesse exemplo a tab_1 foi utilizada dentro da sub-consulta WHERE c.codigo = a.codigo

Update:[size=18]<[/size] Acabei de ver seu post acima… (22 seg antes do meu hehe)
Então, eu costumo confiar no runtime do banco de dados pra escolher a melhor estratégia, geralmente ele costuma ser muito mais esperto que eu hehe… mas se você quer otimizar a consulta, minha sugestão é optar por outras estratégias… ve como está o planejamento da cosulta atual, se tiver muitos sequence scan, crie índices adequados… sub-consultas (pelo menos no meu caso) tendem a ser mais demoradas… Posso estar falando besteira também. não sei como está estruturado seu banco nem sua query, mas é isso que geralmente acontece aqui…[size=18]>[/size]

wagner_a_lima

Cara, dependendo do seu ambiente, acredito que você deva criar tabelas temporarias com seus filtros e depois fazer o cruzamento com elas. Qual banco você utiliza?

R

Olá,

O Banco é um Oracle 11g.
As tabelas estão bem organizadas, foram projetadas por DBA especialistas. Agora você me deixou intrigado drigo, se realmente subconsultas são mais demoradas não há muito o que fazer. Porém, vou testar e depois eu dou um retorno até porque alguns sistemas complexos que eu trabalhei eles apenas ultilizavam subconsultas quando as queries retornavam milhões de registros, por isso busquei essa alternativa. Sobre a pergunta que eu fiz inicialmente eu consegui resolver, basta colocar um INNER JOIN ao invés de uma vírgula após o parenteses.

Att,
Regis

Criado 17 de março de 2011
Ultima resposta 17 de mar. de 2011
Respostas 5
Participantes 3