[firebase-br] Esse SQL é Possível?
Sandro Souza
escovadordebits em gmail.com
Qua Set 9 16:46:22 -03 2009
Bom dia/tarde Luis.
Grande Luis, faço aqui a minha humilde sugestão.
Como diria Jack, o estripador, vamos por partes.
Cada filha só terá um único pai, mas cada pai pode ter N filhas, mas você
quer apenas que apareça a primeira filha do pai selecionado, quando a
seleção foi pelo pai, então vamos unir as duas pesquisas e ordernar tudo no
final.
SELECT * FROM (
SELECT
P.CMPID,
P.CMPNOME,
P.CMPAREARESPONSAVEL,
F.CMPAREAUTILIZADORA
FROM
TABPAI P,
TABFILAH F
WHERE
(F.CMPAREAUTILIZADORA = 7)AND
(P.CMPID = F.CMPIDPAI)
UNION
SELECT FIRST 1
P.CMPID,
P.CMPNOME,
P.CMPAREARESPONSAVEL,
F.CMPAREAUTILIZADORA
FROM
TABPAI P,
TABFILAH F
WHERE
(P.CMPAREARESPONSAVEL = 7)AND
(F.CMPIDPAI = P.CMPID)) TUDO
ORDER BY
CMPID,
CMPAREARESPONSAVEL,
CMPAREAUTILIZADORA
Espero ter ajudado mais que atrapalhado. :D
2009/9/9 Luis <luisfirevb em gmail.com>
> Boa tarde, preciso de uma ajuda num SQL.Tenho duas tabelas assim, com
> relacionamento:
> tabPai.cmpID -> tabFilha.cmpIDPai:
>
> tabPai tabFilha
> ====== =========
> cmpID cmpID
> cmpNome cmpIDPai
> cmpAreaResponsavel cmpAreaUtilizadora
>
> É possível, com boa performance, realizar um único SQL para retornar apenas
> os registros quando a AreaResponsável (tabPai) ou AreaUtilizadora
> (tabFilha)
> forem iguais ao parâmetro passado?
>
> Explicando: O usuário irá selecionar uma área e consultar o banco, então
> terei de trazer todos os registros de tabPai onde a área selecionada esteja
> presente nos dois campos das duas tabelas.
>
> IMPORTANTE: Não pode trazer o mesmo registro repedido, quando há vários
> itens na tabFilha referente a um único registro na tabPai, somente deve
> retornar um único registro da tabPai (sem repetir os dados para cada
> ocorrência de tabFilha).
>
> Tentei esse código baixo, mas retorna o mesmo registro de tabPai repetido
> para cada ocorrência de tabFilha.
>
> SELECT tabPai.cmpID, tabPai.cmpNome, tabPai.cmpAreaResponsavel FROM tabPai
> RIGHT JOIN tabFilha ON tabPai.cmpID = tabFilha.cmpIDPai
> WHERE (((tabFilha.cmpAreaUtilizadora)=7)) OR
> (((tabPai.cmpAreaResponsavel)=7));
>
> Exemplo dos dados na tabela:
>
> tabPai
> cmdID = 1 - cmpNome = Luis - cmpAreaResponsavel = 3
> cmdID = 2 - cmpNome = André - cmpAreaResponsavel = 7
> cmdID = 3 - cmpNome = Márcia - cmpAreaResponsavel = 10
>
> tabFilha
> cmpID = 1 - cmpIDPai = 2 - cmpAreaUtilizadora = 2
> cmpID = 2 - cmpIDPai = 2 - cmpAreaUtilizadora = 20
> cmpID = 3 - cmpIDPai = 2 - cmpAreaUtilizadora = 13
> cmpID = 4 - cmpIDPai = 2 - cmpAreaUtilizadora = 15
> cmpID = 5 - cmpIDPai = 2 - cmpAreaUtilizadora = 16
> cmpID = 6 - cmpIDPai = 1 - cmpAreaUtilizadora = 10
> cmpID = 7 - cmpIDPai = 1 - cmpAreaUtilizadora = 7
> cmpID = 8 - cmpIDPai = 3 - cmpAreaUtilizadora = 15
>
> Então os dados retornados deveriam ser apenas:
> tabPai.cmdID = 1 - tabPai.cmpNome = Luis -
> tabPai.cmpAreaResponsavel
> = 3 - tabFilha.cmpAreaUtilizadora = 7
> tabPai.cmdID = 2 - tabPai.cmpNome = André -
> tabPai.cmpAreaResponsavel
> = 7 - tabFilha.cmpAreaUtilizadora = 20
>
> Reparem:
> A Consulta retornaria apenas os 2 primeiros registros de tabPai, pois no ID
> 1 a área selecionada corresponde a AreaUtilizadora na tabFilha, já no ID 2
> corresponde a AreaResponsavel de tabPai mesmo, o ID 3 não tem nenhum
> correlação. Também só trouxe uma vez o registro Pai ID = 2, apesar de ter
> várias correlações na tabFilha.
>
> ISSO é Possível?
>
> Como?
>
> Obrigado
> Luis
>
>
> ______________________________________________
> 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