Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2023
Banco de Dados›Consultas e Comandos em SQL
Código
qa537514
Banca
FUNDATEC
Órgão
BRDE
Ano
2023
Cargo
Ana Sist ( )
Tabela AREA
Considerando a tabela apresentada na figura, 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.NOME FROM AREA, AREA A2 WHERE ID_AREA_SUPERIOR = A2.ID AND ID_AREA_SUPERIOR IS NOT NULL;
CSELECT A1.NOME, A2.NOME FROM AREA AS AREA_SUB, AREA AS A2 WHERE A1.ID_AREA_SUPERIOR = A2.ID_AREA_SUPERIOR;
DSELECT A1.NOME, A2.NOME FROM AREA A1, AREA A2 WHERE A2.ID_AREA_SUPERIOR = A1.ID AND A1.ID_AREA_SUPERIOR IS NULL;
ESELECT A1.NOME, A2.NOME FROM AREA AS A1, AREA AS A2 WHERE 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”.
Autojunção (Self Join) em SQL
Gabarito: letra E. A consulta correta usa a tabela AREA duas vezes com apelidos (A1 e A2) e relaciona a chave estrangeira ID_AREA_SUPERIOR de uma ocorrência com a chave primária ID da outra, retornando o nome da área e o nome da sua área superior. A alternativa E é a única que faz exatamente essa associação: WHERE A1.ID_AREA_SUPERIOR = A2.ID.
A questão cobra o conceito de autojunção (self join), uma técnica usada quando uma tabela possui uma relação consigo mesma. No caso, a tabela AREA tem uma coluna ID_AREA_SUPERIOR que referencia a própria tabela (um relacionamento hierárquico, como uma árvore de áreas). Para consultar essa hierarquia, é necessário usar a tabela duas vezes na cláusula FROM, criando dois "apelidos" (aliases) para distinguir as duas ocorrências: uma representa a área atual (A1) e a outra representa a área superior (A2).
A lógica da junção é simples: para cada área A1, procuramos na mesma tabela (agora chamada A2) o registro cujo ID seja igual ao ID_AREA_SUPERIOR de A1. Assim, A2 é a área superior de A1. O comando SELECT A1.NOME, A2.NOME retorna, respectivamente, o nome da área e o nome da sua área superior. Essa é a essência da autojunção: a mesma tabela participa da consulta duas vezes, com papéis diferentes.
Vamos analisar cada alternativa para entender por que apenas a letra E está correta. O erro mais comum é inverter a condição de junção ou usar a coluna errada na comparação. A alternativa B, por exemplo, quase acerta, mas esquece de apelidar a primeira tabela, o que gera um erro de sintaxe. A alternativa D inverte a lógica, retornando as áreas que são superiores (e não as que possuem uma superior). A alternativa C compara colunas erradas, e a alternativa A usa uma sintaxe inválida.
A pegadinha central está em identificar corretamente qual coluna referencia qual. A coluna ID_AREA_SUPERIOR de uma área aponta para o ID de outra área (a superior). Portanto, a condição de junção deve ser A1.ID_AREA_SUPERIOR = A2.ID. Qualquer inversão (como em D) ou comparação com a coluna errada (como em C) quebra a lógica da consulta.
Critério
Alternativa E (correta)
Alternativa B (erro comum)
Alternativa D (inversão)
Alias na 1ª tabela
AREA AS A1 (correto)
Sem alias (erro de sintaxe)
AREA A1 (correto)
Condição de junção
A1.ID_AREA_SUPERIOR = A2.ID (correta)
ID_AREA_SUPERIOR = A2.ID (lógica certa, mas sem alias)
A2.ID_AREA_SUPERIOR = A1.ID (invertida)
Filtro adicional
Nenhum (retorna todas as áreas com superior)
Nenhum
A1.ID_AREA_SUPERIOR IS NULL (filtra só áreas raiz)
Resultado retornado
Nome da área + nome da área superior
Inválido (não executa)
Nome da área superior + nome da área subordinada
Alternativa A — ❌ Incorreta
A sintaxe FROM A1 IS AREA, A2 IS AREA é inválida em SQL. A forma correta de criar um alias é FROM AREA AS A1, AREA AS A2 ou simplesmente FROM AREA A1, AREA A2. Além disso, a condição WHERE A1.ID = A2.ID compara as chaves primárias, o que retornaria apenas as áreas com o mesmo ID (ou seja, a própria área), não a relação hierárquica.
Alternativa B — ❌ Incorreta
O comando SELECT NOME, A2.NOME FROM AREA, AREA A2 está incorreto porque a primeira tabela não recebe um alias. Ao escrever apenas AREA, o SQL não sabe como se referir a essa ocorrência na cláusula WHERE. Para que a autojunção funcione, ambas as ocorrências da tabela precisam de apelidos distintos. A condição WHERE ID_AREA_SUPERIOR = A2.ID está correta, mas a falta do alias na primeira tabela torna o comando inválido.
Alternativa C — ❌ Incorreta
A condição WHERE A1.ID_AREA_SUPERIOR = A2.ID_AREA_SUPERIOR compara a coluna ID_AREA_SUPERIOR das duas ocorrências. Isso retornaria áreas que possuem a mesma área superior (ou seja, áreas irmãs), não a relação área-superior. Além disso, a cláusula FROM usa AREA AS AREA_SUB e AREA AS A2, mas a condição referencia A1, que não foi definido como alias — outro erro de sintaxe.
Alternativa D — ❌ Incorreta
A condição WHERE A2.ID_AREA_SUPERIOR = A1.ID inverte a lógica da junção. Aqui, A2 é a área que possui uma superior (A1), ou seja, A1 é a área superior de A2. O comando retornaria os nomes das áreas superiores e os nomes das áreas que estão abaixo delas, mas o enunciado pede o contrário: os nomes das áreas que possuem uma superior e os nomes das suas áreas superiores. Além disso, a condição AND A1.ID_AREA_SUPERIOR IS NULL filtra apenas as áreas que não possuem superior, o que contradiz o objetivo da consulta.
Alternativa E — ✅ Correta ⟵ GABARITO
A alternativa E usa corretamente a autojunção: FROM AREA AS A1, AREA AS A2 cria dois apelidos para a mesma tabela. A condição WHERE A1.ID_AREA_SUPERIOR = A2.ID associa cada área A1 à sua área superior A2, comparando a chave estrangeira de A1 com a chave primária de A2. O SELECT A1.NOME, A2.NOME retorna o nome da área e o nome da sua área superior, exatamente como pedido no enunciado.
PEGA ESSA DICA!
Para resolver questões de autojunção, identifique primeiro a coluna que representa a relação hierárquica (a chave estrangeira que referencia a própria tabela). Em seguida, monte a condição de junção comparando essa coluna de uma ocorrência com a chave primária da outra. Lembre-se: a ocorrência que "aponta" para a outra é a área atual, e a que é "apontada" é a área superior.