Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2023

Banco de DadosSQL
Código
qq890176
Banca
FUNDATEC
Órgão
BRDE
Ano
2023
Nível
Superior
Cargo
Analista de Sistemas - Desenvolvimento de Sistemas
29.png (453×182)
Figura 1 – Tabela AREA
Considerando a tabela apresentada na Figura 1, qual o comando SQL poderá ser executado para que sejam retornados os nomes das áreas que possuem uma área superior e os respectivos nomes de suas áreas superiores.
  1. ASELECT A1.NOME, A2.NOME FROM A1 IS AREA, A2 IS AREA WHERE A1.ID = A2.ID;
  2. BSELECT NOME, A2.NOMEFROM AREA, AREA A2WHERE ID_AREA_SUPERIOR = A2.IDAND ID_AREA_SUPERIOR IS NOT NULL;
  3. CSELECT A1.NOME, A2.NOMEFROM AREA AS AREA_SUB, AREA AS A2WHERE A1.ID_AREA_SUPERIOR = A2.ID_AREA_SUPERIOR;
  4. DSELECT A1.NOME, A2.NOMEFROM AREA A1, AREA A2WHERE A2.ID_AREA_SUPERIOR = A1.IDAND A1.ID_AREA_SUPERIOR IS NULL;
  5. ESELECT A1.NOME, A2.NOMEFROM AREA AS A1, AREA AS A2WHERE A1.ID_AREA_SUPERIOR = A2.ID;
Revelar gabarito e comentário

GabaritoE — SELECT A1.NOME, A2.NOME FROM AREA AS A1, AREA AS A2 WHERE A1.ID_AREA_SUPERIOR = A2.ID;

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Auto junção (self join) em SQL para hierarquias

Gabarito: letra E. A consulta correta usa uma auto junção (self join) da tabela AREA consigo mesma, criando dois aliases (A1 e A2) e relacionando a coluna ID_AREA_SUPERIOR de uma cópia com a coluna ID da outra — exatamente o que a alternativa E faz. Esse é o padrão clássico para consultar dados hierárquicos (como áreas e suas áreas superiores) em uma única tabela.

A questão trata de um conceito fundamental de SQL: a auto junção (self join). Quando uma tabela possui uma referência a si mesma — aqui, a coluna ID_AREA_SUPERIOR aponta para o ID de outra linha da própria tabela AREA —, precisamos "duplicar" a tabela na consulta usando aliases (apelidos). Isso permite tratar a mesma tabela como se fossem duas tabelas distintas: uma representando a área atual (A1) e outra representando a área superior (A2).

A lógica da junção é simples: para cada área A1, queremos encontrar a área A2 cujo ID seja igual ao ID_AREA_SUPERIOR de A1. Em SQL, isso se traduz na condição WHERE A1.ID_AREA_SUPERIOR = A2.ID. Essa condição é o coração da consulta — é ela que estabelece o vínculo entre a área e sua superior.

Vamos pensar em um exemplo concreto. Suponha que a tabela AREA tenha os seguintes dados:

ID

NOME

ID_AREA_SUPERIOR

1

Diretoria

NULL

2

Gerência

1

3

Coordenação

2

A consulta da alternativa E retornaria:

  • A1.NOME = 'Gerência', A2.NOME = 'Diretoria' (pois a Gerência tem ID_AREA_SUPERIOR = 1, que é o ID da Diretoria)

  • A1.NOME = 'Coordenação', A2.NOME = 'Gerência' (pois a Coordenação tem ID_AREA_SUPERIOR = 2, que é o ID da Gerência)

A Diretoria não apareceria como A1, pois seu ID_AREA_SUPERIOR é NULL (ela é a área de topo, sem superior).

A pegadinha da banca está em inverter os papéis das colunas na condição de junção. Muitas alternativas trocam A1.ID_AREA_SUPERIOR = A2.ID por outras combinações, como A1.ID = A2.ID (que não faz sentido hierárquico) ou A2.ID_AREA_SUPERIOR = A1.ID (que inverte a relação, retornando as áreas superiores e suas subordinadas, mas com a condição errada de A1.ID_AREA_SUPERIOR IS NULL).

Guarde o padrão: para uma hierarquia em uma única tabela, a auto junção sempre relaciona a chave estrangeira (a coluna que aponta para o pai) de uma cópia com a chave primária (a coluna ID) da outra cópia. É esse critério que separa a alternativa correta das demais.

1Para hierarquias
Relaciona FK com PK
A1.ID_AREA_SUPERIOR = A2.ID
2Aliases obrigatórios
FROM AREA A1, AREA A2
Qualifica colunas (A1.NOME)
3Erros comuns
ID = ID (sem hierarquia)
FK = FK (áreas irmãs)
Inverter relação (A2.FK = A1.ID)
Auto junção (self join)
LEVELsoulevel.com.br
Auto junção (self join): Para hierarquias (Relaciona FK com PK, A1.ID_AREA_SUPERIOR = A2.ID); Aliases obrigatórios (FROM AREA A1, AREA A2, Qualifica colunas (A1.NOME)); Erros comuns (ID = ID (sem hierarquia), FK = FK (áreas irmãs), Inverter relação (A2.FK = A1.ID))

Alternativa A — ❌ Incorreta

Esta alternativa usa uma sintaxe inválida: FROM A1 IS AREA, A2 IS AREA. A palavra-chave IS não é usada para criar aliases em SQL — o correto é AS ou simplesmente a justaposição (ex.: FROM AREA A1, AREA A2). Além disso, a condição WHERE A1.ID = A2.ID é logicamente incorreta para o problema: ela relacionaria cada área a si mesma (ou a outra área com o mesmo ID), não à sua área superior. O erro é duplo: sintaxe de alias errada e condição de junção sem sentido hierárquico.

Alternativa B — ❌ Incorreta

Esta alternativa tem dois problemas. Primeiro, a projeção SELECT NOME, A2.NOME referencia a coluna NOME sem alias, o que é ambíguo quando a mesma tabela aparece duas vezes na consulta (o banco não saberia de qual cópia extrair). Segundo, a condição WHERE ID_AREA_SUPERIOR = A2.ID também referencia ID_AREA_SUPERIOR sem alias, gerando ambiguidade. Embora a lógica da junção (ID_AREA_SUPERIOR = A2.ID) esteja correta, a falta de qualificação das colunas torna o comando inválido ou, no mínimo, ambíguo.

Alternativa C — ❌ Incorreta

Aqui o erro está na condição de junção: WHERE A1.ID_AREA_SUPERIOR = A2.ID_AREA_SUPERIOR. Essa condição relacionaria áreas que possuem a mesma área superior (ou seja, áreas irmãs), não uma área com sua superior. Além disso, a projeção SELECT A1.NOME, A2.NOME referencia os aliases A1 e A2, mas o FROM define os aliases como AREA_SUB e A2 — ou seja, o alias A1 não existe, tornando o comando inválido.

Alternativa D — ❌ Incorreta

Esta alternativa inverte a relação. A condição WHERE A2.ID_AREA_SUPERIOR = A1.ID faz com que A1 seja a área superior e A2 a área subordinada. Além disso, a condição adicional AND A1.ID_AREA_SUPERIOR IS NULL restringe A1 a ser apenas a área de topo (sem superior). O resultado seria apenas as áreas diretamente subordinadas à área de topo, não todas as áreas com suas respectivas superiores. A projeção também está invertida: retornaria o nome da área superior (A1) e o nome da subordinada (A2), quando o enunciado pede o contrário.

Alternativa E — ✅ Correta ⟵ GABARITO

Esta é a consulta correta. Ela cria dois aliases (A1 e A2) para a mesma tabela AREA e usa a condição WHERE A1.ID_AREA_SUPERIOR = A2.ID, que relaciona cada área (A1) à sua área superior (A2) pelo ID. A projeção SELECT A1.NOME, A2.NOME retorna exatamente o que o enunciado pede: o nome da área e o nome de sua área superior. A sintaxe FROM AREA AS A1, AREA AS A2 é válida e clara.

PEGA ESSA DICA!

Para identificar a auto junção correta em questões de hierarquia, procure a condição que relaciona a chave estrangeira (coluna que aponta para o pai, como ID_AREA_SUPERIOR) de uma cópia com a chave primária (ID) da outra. Se a condição usar ID = ID ou ID_AREA_SUPERIOR = ID_AREA_SUPERIOR, está errada. E lembre-se: sempre qualifique as colunas com o alias para evitar ambiguidade.

Gabarito: letra E

Link permanente: /questoes/qq890176