[firebase-br] Fwd: Select com NOT IN

Magnun Oliveira magnunoliveira em gmail.com
Seg Jul 20 11:34:26 -03 2009


obrigado Glautter mas nao funcionou.
no seu exemplo retornam as cidades que nao sairam nenhuma entrega.
o que eu preciso é indicar uma cidade e retornar todas as cidades que nao
receberam nenhuma entrega dela.
CIDADES
id_cidade ---- cidade
1 ---- A
2 ---- B
3 ---- C
4 ---- D
5 ---- E
ENTREGAS
id_entrega ---- id_cidade_origem ---- id_cidade (destino)
1 ---- 2 ---- 1
2 ---- 2 ---- 3
na tabela acima foram feitas duas entregas, a primeira partiu da cidade 2 e
foi pra cidade 1, na segunda entrega, partiu da cidade 2 e foi pra cidade 3.
preciso retornar quais cidades nao receberam entregas da cidade 2, no caso o
parametro :cidade.
o resultado teria que ser  as cidades 2, 4 e 5. Este resultado eu obtenho
corretamente com o sql:
SELECT ID_CIDADE, CIDADE
FROM CIDADES
WHERE ID_CIDADE NOT IN
  (SELECT ID_CIDADE FROM ENTREGAS WHERE ID_CIDADE_ORIGEM = :CIDADE)
porem no meu caso sao muitas cidades e muitas entregas, causando um leg de
mais de 15 minutos.
obrigado.
2009/7/20 glautter glauber <glautterg em gmail.com>

> Primeira dica eh se puder evitar subquery na cláusula where já eh um grande
> passo,
> lógico se não tiver jeito deve-se usar.
> Pois para cada registro de CIDADE vai ser varrida a tabela ENTREGAS
> isso quer dizer se a tabela CIDADE tiver 200 mil campos, será varrida 200
> mil vezes a tabela de ENTREGAS e isso tende a aumentar o custo de acordo
> com
> a inserção de dados.
>
> mas para o seu caso veja se ajuda esta forma
>
> SELECT DISTINCT CID.ID_CIDADE
>     , CID.CIDADE
>  FROM CIDADES CID, ENTREGAS ENT
>  WHERE ENT.ID_CIDADE_ORIGEM =:cidade
>   AND CID.ID_CIDADE <> ENT.ID_CIDADE_ORIGEM
>
> esta foi a forma que eu entendi,
>
> abraço,
>
>
>
> 2009/7/19 Magnun Oliveira <magnunoliveira em gmail.com>
>
> >  Boa tarde .
> >
> > Tenho uma tabela de cidades e uma de entregas, e nela existe um campo
> > id_cidade_origem e id_cidade ( para o destino ),  ambos foreign key de
> > CIDADES.
> >
> > Gostaria de selecionar todas as cidades da tabela CIDADES que nao
> receberam
> > nenhuma entrega, de uma cidade de origem especificada por mim.
> >
> > Segue o sql:
> >
> > select cidades.id_cidade, cidades.cidade from cidades where
> > cidades.id_cidade not in (select * from entregas where id_cidade_origem =
> > :cidade)
> >
> > A consulta é efetuada com sucesso, porem demora bastante devido a
> > quantidade
> > de registros.
> >
> > Gostaria de ajuda pra otimizar esta consulta.
> >
> > ps: fiz o seguinte sql:
> >
> > select cidades.id_cidade, cidades.cidade from cidades where not exists
> > (select * from entregas where id_cidade_origem = :cidade)
> >
> > Nao retorna nenhum registro, mesmo ocorrendo mais de 100 cidades que nao
> > receberam entregas da cidade especificada no ":cidade".
> >
> > se tirar o not, retornam todas as cidades da tabela CIDADES.
> >
> > agradeço desde jah.
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista