Fórum Dúvida com SQL #375638
06/10/2009
0
seguinte: preciso de ajuda pra montar uma consulta SQL com as seguintes condições
tenho uma tabela de filiais com a seguinte estrutura:
[b:04da4a6fdc]fil_nome[/b:04da4a6fdc] | [b:04da4a6fdc]fil_cidade[/b:04da4a6fdc]
empresa a | cidade a
empresa a | cidade b
empresa b | cidade a
empresa b | cidade b
empresa c | cidade b
empresa d | cidade a
empresa d | cidade c
preciso listar as empresas que tenham filiais em todas as cidades de uma empresa.
ex: se eu passar a empresa a como parâmetro, ele tem que retornar empresa a e empresa b, pq a b tem filiais em todas as cidades onde tem a empresa a (cidade a e cidade b).
se passar a c, ele tem que retornar empresa a, empresa b e empresa c, pq todas elas tem filiais na cidade b.
consegui fazer listar todas as filiais de uma cidade (fácil), mas quando é pra listar TODAS não consigo.
uso delphi 7, com PostgreSQL e conexão ADO.
grato.
Alanporto
Curtir tópico
+ 0Posts
06/10/2009
Afarias
select a.fil_nome from tabela a
where exists (select 1 from tabela
where fil_cidade=a.fil_cidade and fil_nome=:p_nome)
group by a.fil_nome
having count(*)>=(select count(*) from tabela
where a.fil_nome=:p_nome);
Bom, isso para FB... eu não conheço PostgreSQL bem... mas dai vc tira... Por exemplo, se o PostgreSQL não suportar EXISTS vc pode converter para IN:
select a.fil_nome from tabela a
where a.fil_cidade IN (select fil_cidade from tabela
where fil_nome=:p_nome)
group by a.fil_nome
having count(*)>=(select count(*) from tabela
where a.fil_nome=:p_nome);
T+
Gostei + 0
06/10/2009
Alanporto
vou testar e depois retorno se funcionou.
valeu afarias.
Gostei + 0
06/10/2009
Adilsond
SELECT DISTINCT B.FIL_NOME,B.FIL_CIDADE FROM FILIAIS A, FILIAIS B WHERE A.FIL_NOME = :EMPRESA AND B.FIL_CIDADE = A.FIL_CIDADE
Gostei + 0
07/10/2009
Alanporto
lembrando: precisa ser exclusivamente em todas as cidades onde há filiais da empresa.
vo tentando aqui com base na consulta do afarias, qualquer resultado retorno.
grato.
Gostei + 0
07/10/2009
Adilsond
SELECT A.FIL_NOME,A.FIL_CIDADE FROM FILIAIS A WHERE A.FIL_NOME = ´empresa a´
depois
SELECT B.FIL_NOME,B.FIL_CIDADE FROM FILIAIS B WHERE B.FIL_CIDADE = ´cidade a´
Se o código passado por mim anteriormente não funcionou é porque seus dados não devem possuir uma relação. Verifique os resultados executando separadamente as consultas acima.
Gostei + 0
13/10/2009
Emerson Nascimento
select *
from filiais a
left join filiais b on b.fil_cidade = a.fil_cidade
where a.fil_nome = ´empresa a´
ou
select *
from filiais a
where a.fil_nome = ´empresa a´
union all
select *
from filiais b
where b.fil_cidade in
(select c.fil_cidade
from filiais c
where c.fil_nome = ´empresa a´)
Gostei + 0
13/10/2009
Alanporto
tentar explicar direito: o retorno deve ser as empresas que tem filiais em todas as cidades onde também tem filiais da empresa passada. Se fosse uma cidade só era fácil:
select fil_nome from filiais where fil_cidade = ´cidade a´
mas se eu usar um subselect pra trazer as cidades e usar IN (fil_cidade IN <subselect>), ele considera qualquer filial que exista em qualquer cidade.
a saída desejada é essa, para o parâmetro:
Empresa a: a,b (ambas tem nas cidades a e b)
Empresa b: a,b (ambas tem nas cidades a e b)
Empresa c: a,b,c (todas elas tem filiais na cidade b)
Empresa d: nulo (ninguém mais tem empresas na cidade a e c)
espero ter explicado direito, valeu pela ajuda!!
ps: tentei usar in all, except e intersect, mas não consegui (mas talvez seja por aí)
Gostei + 0
13/10/2009
Afarias
Interessante, testando com os dados q vc passou isso não acontece comigo usando FB.
T+
Gostei + 0
13/10/2009
Alanporto
Gostei + 0
13/10/2009
Afarias
Gostei + 0
13/10/2009
Afarias
T+
Gostei + 0
13/10/2009
Emerson Nascimento
tente assim:
select b.fil_nome from filiais b where b.fil_cidade in ( select a.fil_cidade from filiais a where a.fil_nome=´empresa a´ ) group by b.fil_nome having count(*) = (select count(*) from filiais a where a.fil_nome=´empresa a´)
Gostei + 0
13/10/2009
Alanporto
afarias, valeu por responder, mas eu troquei o parâmetro por ´empresa a´ e ainda retornou a empresa d.
Gostei + 0
13/10/2009
Afarias
não estava compreendendo como pode dar certo para mim e não dar certo para vc e ai vi no código q postei tem um pequeno erro de sintaxe que faz o resultado aparecer errado.
O código correto q eu estava testando (e dá certo) É:
select a.fil_nome from tabela a
where exists (select 1 from tabela
where fil_cidade=a.fil_cidade and fil_nome=:p_nome)
group by a.fil_nome
having count(*)>=(select count(*) from tabela
where [b:1aa394a114]fil_nome[/b:1aa394a114]=:p_nome);
NOTE a correção na última linha (em negrito) ... eu tinha postado a.fil_nome quando o correto é apenas fil_nome pois o campo deve ser do sub-select e não da consulta principal
=)
Era só isso, desculpe.
T+
Gostei + 0
14/10/2009
Alanporto
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)