MC 536 - "Exercícios sobre a tabela Pais-e-Filhos"

Prof. Célio Guimarães     IC - Unicamp


Atualizado em 28 Set 2022

Seja D uma tabela com esquema D(p,f) representando um relacionamento entre pessoas da seguinte forma: uma linha (p,q) de uma instância da tabela D significa que a pessoa p possui como filho (ou filha) a pessoa q. Vamos impor a seguinte regra de consistência para a tabela D: se existe uma linha (p,q) em D, necessariamente há outra linha (m,q) (m # p), representando os pais da pessoa q (sem especificar o sexo), ou seja, para cada pessoa presente na tabela D, ou existe informação sobre ambos os pais ou nenhuma informação sobre os mesmos.
No esquema dado veja p como mnemônico para pai/mãe e f como mnemonico para filho/a (sem especificar o sexo)

Escreva comandos SQL para cada consulta a seguir:
(eliminando repetições, onde apropriado). Você pode, opcionalmente, usar order bypara melhor visualizar o resultado.

  1. Dê uma lista de pessoas cujos pais estão presentes em D.
  2. Dê uma lista de pessoas cujos pais não estão presentes em D.
  3. Dê uma lista de pessoas que nâo têm filhos.
  4. Dê uma lista de pessoas que são avós.
  5. * Dê uma lista de pares de pessoas (sem repetição) que são pais de um ou mais filhos.
  6. * Dê uma lista de pares de pessoas (sem repetição) que são irmãos ou meio-irmãos.
  7. * Dê uma lista de triplas de pessoas (p1, p2, f) onde p1 e p2 são pais de f.
  8. * Dê uma lista de triplas de pessoas (a1, a2, n) onde a1 e a2 são avós de n.
  9. ** Dê uma lista de pares de pessoas (t,s) em que t é diretamente tio de s, ou seja, s é filho de um irmão de t.
  10. ** Dê uma lista de pares de pessoas que são primos em primeiro grau
  11. ** Dê uma lista de pares de pessoas que são irmãos de pai e mãe (isto é, não são meio-irmãos)
Sugestões:
(i) Use o diagrama árvore genealógica que representa a instância da tabela D para verificar a correção das suas soluções.
(ii) As consultas marcadas com "**" são extensões de consultas anteriores.
Por exemplo: sobrinhos são filhos de irmãos ou meio-irmãos (consulta f)"
Analogamente, "primos são filhos de irmãos ou meio-irmãos (consulta f)"
Solução de e:
select d1.p, d2.p
from D d1, D d2
where d1.f = d2.f and d1.p < d2.p   -- "<" em vez de "<>" para eliminar repetições