SQL: LEFT JOIN com filtro de NULL
Gabarito: letra A. A consulta retorna os nomes dos recursos que não possuem nenhuma alocação a projeto, ou seja, recursos alocados a nenhum projeto. Isso ocorre porque o LEFT JOIN preserva todas as linhas da tabela à esquerda (recurso) e, para os recursos sem correspondência em alocacao, preenche as colunas da direita com NULL; o filtro WHERE a.id_projeto IS NULL seleciona exatamente esses registros.
O LEFT JOIN (ou LEFT OUTER JOIN) é uma operação da álgebra relacional que combina duas tabelas, mantendo todas as linhas da tabela à esquerda (a primeira mencionada no FROM) e trazendo as colunas da tabela à direita apenas quando há correspondência na condição de junção (ON). Quando não há correspondência, as colunas da tabela da direita são preenchidas com NULL. No caso da consulta, a tabela recurso é a da esquerda e alocacao é a da direita. A condição de junção é a.id_recurso = r.id, ou seja, relaciona cada recurso com suas alocações.
O filtro WHERE a.id_projeto IS NULL atua após a junção, selecionando apenas as linhas em que a coluna id_projeto da tabela alocacao é NULL. Isso acontece justamente para os recursos que não têm nenhuma linha correspondente em alocacao — ou seja, recursos que nunca foram alocados a nenhum projeto. Portanto, a consulta lista os nomes dos recursos que estão sem alocação.
Para entender melhor, considere um exemplo: se a tabela recurso tem os recursos 'Martelo', 'Serra' e 'Parafuso', e a tabela alocacao tem apenas uma linha alocando 'Martelo' ao projeto 1, o LEFT JOIN produzirá:
r.nome | a.id_projeto |
|---|
Martelo | 1 |
Serra | NULL |
Parafuso | NULL |
O filtro WHERE a.id_projeto IS NULL seleciona apenas 'Serra' e 'Parafuso', que são os recursos não alocados.
A pegadinha da questão está em interpretar corretamente o efeito do LEFT JOIN combinado com o filtro de NULL. Muitos candidatos confundem com um INNER JOIN (que retornaria apenas os recursos com alocação) ou com um RIGHT JOIN (que preservaria as linhas da direita). A chave é lembrar que o LEFT JOIN preserva a tabela da esquerda e o filtro IS NULL captura exatamente os registros sem correspondência.
Alternativa A — ✅ Correta ⟵ GABARITO
A alternativa A está correta porque a consulta retorna os nomes dos recursos que não possuem nenhuma alocação a projeto. O LEFT JOIN preserva todos os recursos, e o filtro WHERE a.id_projeto IS NULL seleciona aqueles cuja coluna id_projeto é NULL, o que ocorre apenas quando não há linha correspondente em alocacao. Portanto, são recursos alocados a nenhum projeto.
Alternativa B — ❌ Incorreta
A alternativa B está incorreta porque a consulta retorna recursos sem alocação, não recursos designados a projetos com verba alocada. O filtro IS NULL exclui justamente os recursos que têm alocação, independentemente de a verba estar alocada ou não. A alternativa descreveria um cenário com INNER JOIN e algum filtro de verba, o que não é o caso.
Alternativa C — ❌ Incorreta
A alternativa C está incorreta porque "distribuídos à esquerda de projetos" não tem significado técnico em SQL. O termo "esquerda" refere-se à tabela preservada no LEFT JOIN, mas não descreve o resultado da consulta. A consulta retorna recursos sem alocação, não recursos distribuídos de alguma forma específica.
Alternativa D — ❌ Incorreta
A alternativa D está incorreta porque a consulta retorna recursos cuja coluna id_projeto é NULL, mas isso não significa que os projetos tenham identificação nula. O NULL está na tabela alocacao, indicando ausência de alocação, não que exista um projeto com id nulo. A alternativa confunde o NULL resultante da junção com um valor nulo em uma coluna de projeto.
Alternativa E — ❌ Incorreta
A alternativa E está incorreta porque a consulta não envolve nomes de projetos. Ela retorna nomes de recursos (r.nome), e o filtro é sobre a.id_projeto, não sobre nomes de projetos. A alternativa descreveria uma consulta que filtra projetos sem nome, o que não é o caso.
Gabarito: letra A