Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024

Banco de DadosConsultas e Comandos em SQL
Código
qa630709
Banca
FUNDATEC
Órgão
CETENE
Ano
2024
Cargo
Tecno P ( )

Para responder a questão abaixo, considere o modelo entidade-relacionamento (ER) apresentado pela figura abaixo:

Imagem associada para resolução da questão

Figura 1 - Modelo entidade - realcionamento (ER)

 

Considerando o modelo ER apresentado pela Figura 1, pretende-se implementar uma expressão SQL para apresentar os registros de Servico que NÃO estão associados com qualquer Unidade. Analise as assertivas abaixo e assinale a alternativa correta.

 

I. select ser_descricao from Servico

where ser_id not in (select S.ser_id

from Unidade U

inner join UnidadeServico US on U.uni_id = US.uni_id

inner join Servico S on US.ser_id = S.ser_id)

 

II. select ser_descricao

from Unidade U

inner join UnidadeServico US on U.uni_id = US.uni_id

inner join Servico S on US.ser_id = S.ser_id

where US.ser_id is null

 

III. select ser_descricao

from Unidade U

inner join UnidadeServico US on U.uni_id = US.uni_id

right join Servico S on US.ser_id = S.ser_id

where US.ser_id is null


  1. ATodas as assertivas estão corretas.
  2. BTodas as assertivas estão incorretas.
  3. CApenas a assertiva II está correta.
  4. DApenas as assertivas I e III estão corretas.
  5. EApenas as assertivas II e III estão corretas.
Revelar gabarito e comentário

GabaritoD — Apenas as assertivas I e III estão corretas.

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”.

Consultas SQL: identificando registros sem associação

Gabarito: letra D. As assertivas I e III estão corretas, pois ambas retornam corretamente os registros de Servico que não possuem associação com nenhuma Unidade — a I usa a subconsulta com NOT IN, e a III usa o RIGHT JOIN com filtro de nulos. A assertiva II está incorreta, pois o INNER JOIN elimina exatamente os registros sem correspondência, tornando a condição WHERE US.ser_id IS NULL sempre falsa.

O problema central é identificar, em um banco relacional, quais registros de uma tabela não possuem correspondência em outra, através de uma tabela de associação (tabela pivô). No modelo apresentado, UnidadeServico é a entidade associativa que liga Unidade e Servico — se um serviço não aparece nessa tabela, ele não está associado a nenhuma unidade. Existem duas abordagens clássicas para resolver isso em SQL: a subconsulta com NOT IN (ou NOT EXISTS) e a junção externa (LEFT JOIN ou RIGHT JOIN) com verificação de nulos.

A subconsulta com NOT IN funciona selecionando os serviços cujo ser_id não está presente no conjunto de ser_id que possuem associação. Já a junção externa preserva todos os registros de uma das tabelas — no RIGHT JOIN, todos os registros da tabela à direita (Servico) são mantidos, e os que não têm correspondência na tabela à esquerda recebem valores nulos nas colunas desta. Filtrando por US.ser_id IS NULL, obtemos exatamente os serviços sem associação.

A pegadinha da assertiva II está no uso do INNER JOIN: essa junção retorna apenas os registros que possuem correspondência em ambas as tabelas, ou seja, apenas os serviços que JÁ estão associados a alguma unidade. Portanto, a condição WHERE US.ser_id IS NULL nunca será verdadeira, pois o INNER JOIN já descartou as linhas sem correspondência. É a diferença fundamental entre junção interna e junção externa que decide esta questão.

Guarde a distinção entre INNER JOIN (descarta sem par) e RIGHT JOIN/LEFT JOIN (preserva sem par): é exatamente nela que as assertivas se dividem.

Serviços sem associação com Unidade
  • 1Abordagens corretas
    • Subconsulta NOT IN
      • Seleciona ser_id com associação
      • Filtra quem não está no conjunto
    • RIGHT JOIN com IS NULL
      • Preserva todos os serviços
      • Nulos para quem não tem par
  • 2Pegadinha: INNER JOIN
    • Só retorna quem tem par
    • IS NULL nunca é verdadeiro
LEVEL · soulevel.com.br

Assertiva I — ✅ Correta

A consulta usa uma subconsulta para obter todos os ser_id que possuem associação com alguma unidade (através dos INNER JOINs entre Unidade, UnidadeServico e Servico). Em seguida, o WHERE ser_id NOT IN (...) seleciona os serviços cujo ser_id não está nesse conjunto — exatamente os serviços sem associação. A lógica está correta e o resultado atende ao pedido.

Assertiva II — ❌ Incorreta

O INNER JOIN retorna apenas as linhas com correspondência entre as tabelas. Como a consulta parte de Unidade e junta com UnidadeServico e Servico, o resultado contém apenas serviços que possuem associação. A condição WHERE US.ser_id IS NULL nunca será verdadeira, pois o INNER JOIN já eliminou as linhas sem correspondência. O resultado seria um conjunto vazio, não os serviços sem associação.

Assertiva III — ✅ Correta

O RIGHT JOIN preserva todos os registros da tabela à direita (Servico). Para os serviços sem associação, as colunas da tabela à esquerda (Unidade e UnidadeServico) ficam com valores nulos. A condição WHERE US.ser_id IS NULL filtra exatamente esses serviços, retornando o resultado desejado. A lógica está correta.

NÃO CAIA NESSA!

A banca explora a confusão entre INNER JOIN e junções externas. No INNER JOIN, a condição IS NULL é sempre falsa, pois a junção já descartou as linhas sem par. Já no RIGHT JOIN (ou LEFT JOIN), as linhas sem par são preservadas com valores nulos, tornando o filtro eficaz. Lembre-se: junção interna = só quem tem par; junção externa = todos, com nulos para quem não tem par.

Gabarito: letra D — corretas apenas as assertivas I e III.

Link permanente: /questoes/qa630709