[firebase-br] Esse SQL é Possível?

Luis luisfirevb em gmail.com
Qua Set 9 15:17:55 -03 2009


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





Mais detalhes sobre a lista de discussão lista