[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