DÊVIDA NA ELABORA?ÃO DE CONSULTA SQL

ANINHAX 24/03/2014 12:06:00
#436445
Olá!

Tendo a tabela clDependentes e clAfinidades, eu preciso retornar a Qtd de dependentes de um determinado funcionário cujo parentesco não seja igual a ([ô]Cônjuge[ô],[ô]Pai[ô],[ô]Mãe[ô]), mas quero todo os dependentes filhos cuja idade seja maior ou igual a 19 anos.

Elaborei a consulta abaixo, mas não tenho certeza se irá funcionar corretamente (vejam que no operador not in, eu coloco [ô]Filho(a)[ô], e logo abaixo especifico que só quero retornar aqueles filhos cuja idade seja maior ou igual a 19 anos)

select count(clDep.ID) from clDependentes clDep inner join clAfinidades clAfi on (clDep.id_afinidade = clAfi.id_afinidade) where clDep.id_visitante = 5
and clAfi.parentesco not in ([ô]Cônjuge[ô],[ô]Pai[ô],[ô]Mãe[ô],[ô]Filho(a)[ô]) or
(clAfi.parentesco = [ô]Filho(a)[ô] and clDep.Idade >= 19 and clDep.id_visitante = 5)

Esta consulta deu certo, mas eu não sei exatamente o motivo dela ter funcionado, e isso me deixa com dúvidas.

Grata,
Ana
MARCELO.TREZE 24/03/2014 13:13:47
#436449
Posso estar errado porque usar not in (pai, mae, conjuge, se pode usar apenas = filho

Select count(clDep.ID) from clDependentes clDep inner join clAfinidades clAfi on (clDep.id_afinidade = clAfi.id_afinidade) where (clAfi.parentesco = [ô]Filho(a)[ô] and clDep.Idade >=  19) and clDep.id_visitante = 5

TUNUSAT 24/03/2014 13:18:53
#436450
ANINHAX,

Vou tentar analisar sua query para ver se te ajuda...

- SELECT
Traz somente o conta (total) de dependentes: [Ô]count(clDep.ID)[Ô]

- FROM
Você fez o INNER JOIN da tabelas [Ô]clDependentes[Ô] e [Ô]clAfinidades[Ô] juntando a Chave Estrangeira (clDep.id_afinidade) e a Chave Primária (clAfi.id_afinidade).

- WHERE
O ID de visitante sempre será [Ô]5[Ô]? (clDep.id_visitante = 5)
AND
O campo [Ô]clAfi.parentesco[Ô] tem o nome por extenso do grau de parentesco ... isto não considero bom, pois pode-se errar na digitação, o certo seria ter um número de
ID (chave primária) nesta posição. Exemplos: Ao invés de: (([ô]Cônjuge[ô],[ô]Pai[ô],[ô]Mãe[ô],[ô]Filho(a)[ô]), use assim: (2,5,6,8). Isola corretamente estes parentescos.

OR

No caso de ser [ô]Filho(a)[ô] (mais uma vez é preferível usar o ID do [ô]filho[ô] do que o nome por extenso).
AND
clDep.Idade >= 19
AND
clDep.id_visitante = 5 (sempre o código 5 para ID visitante novamente ... não poder ser outro tipo de visitante?)

O [ô]filho[ô] é independente dos outros graus de parentesco como você quer. Dois trechos de [ô]where[ô] separados por [ô]OR[ô] (ou um ou outro).

é isto?

[][ô]s,
Tunusat.
ANINHAX 24/03/2014 13:20:47
#436451
Grata, MARCELO-TREZE
Porque da lista de Afinidades (e são várias) , eu preciso de todos(as), menos as que estão sendo explícitamente citadas. Ah, e também quero os Filhos(as) cuja idade esteja dentro do critéro especificado.

Ana
ANINHAX 24/03/2014 13:28:16
#436452
TUNUSAT, obrigada.

Eu postei dessa forma para ficar mais claro para quem for responder, e sim, o sistema utiliza os IDs.
Ah, o clDep.id_visitante = 5 também foi para ficar mais legível, só isso!

Ana
MARCELO.TREZE 24/03/2014 14:38:48
#436455
Naõ tenho certeza que de certo mas teste

Select count(clDep.ID) from clDependentes clDep inner join clAfinidades clAfi on (clDep.id_afinidade = clAfi.id_afinidade) where clAfi  not in ([ô]Cônjuge[ô],[ô]Pai[ô],[ô]Mãe[ô]) and (clAfi.parentesco = [ô]Filho(a)[ô] and clDep.Idade >=  19) and clDep.id_visitante = 5
ANINHAX 24/03/2014 15:00:31
#436457
Grata, Marcelo

Dessa forma somente retorna 1 [Ô]uma[Ô] linha, ou seja, apenas executou o critério para filho maior de 19.
MARCELO.TREZE 24/03/2014 15:28:58
#436461
E o que teria de retornar?
ANINHAX 24/03/2014 17:52:15
#436465
Marcelo,
Teria que retornar as seguintes linhas:

-Sogro(a)
-Primo(a)
-Filho(a) (de 19 anos - esta retornou corretamente)
MARCELO.TREZE 24/03/2014 18:21:16
#436472
mais uma tentativa

Select count(clDep.ID), clAfi.* from clDependentes clDep inner join clAfinidades clAfi on (clDep.id_afinidade = clAfi.id_afinidade) where clAfi  not in ([ô]Cônjuge[ô],[ô]Pai[ô],[ô]Mãe[ô]) and (clDep.Idade >=  19 and clDep.id_visitante = 5)
ANINHAX 24/03/2014 18:47:58
#436474
Marcelo,

Agora somente retornou Sogro(a) e Filho(a), mas faltou o primo de 13 anos.

Agradeço as tentativas...
Página 1 de 2 [11 registro(s)]
Faça seu login para responder