Analista de Sistemas - Desenvolvimento de Sistemas
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.
ASELECT A1.NOME, A2.NOME FROM A1 IS AREA, A2 IS AREA WHERE A1.ID = A2.ID;
BSELECT NOME, A2.NOMEFROM AREA, AREA A2WHERE ID_AREA_SUPERIOR = A2.IDAND ID_AREA_SUPERIOR IS NOT NULL;
CSELECT A1.NOME, A2.NOMEFROM AREA AS AREA_SUB, AREA AS A2WHERE A1.ID_AREA_SUPERIOR = A2.ID_AREA_SUPERIOR;
DSELECT A1.NOME, A2.NOMEFROM AREA A1, AREA A2WHERE A2.ID_AREA_SUPERIOR = A1.IDAND A1.ID_AREA_SUPERIOR IS NULL;
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.
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.