Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026

Banco de DadosConsultas e Comandos em SQL
Código
fc142293
Banca
FCC
Órgão
SEFAZ MT
Ano
2026
Cargo
FTE ( )

Um data warehouse relaciona NF-e (tabela T_NFE) a registros de pagamento (tabela T_PAGAMENTO, referenciada no SQL pelo alias p), com a necessidade de listar todas as NF-e autorizadas mesmo quando não exista pagamento associado e considere apenas pagamentos cuja coluna situacao esteja com valor 'CONFIRMADO'. Nesse caso, a forma de impor a condição sobre p.situacao sem eliminar NF-e sem pagamento é

  1. Ausar RIGHT JOIN preservando T_PAGAMENTO e filtrar p.situacao no WHERE.
  2. Busar FULL OUTER JOIN e filtrar p.situacao no WHERE para manter o conjunto.
  3. Caplicar p.situacao = 'CONFIRMADO' na cláusula ON do LEFT JOIN com T_PAGAMENTO.
  4. Daplicar p.situacao = 'CONFIRMADO' na cláusula WHERE após o LEFT JOIN.
  5. Esubstituir o LEFT JOIN por INNER JOIN e manter o predicado no ON.
Revelar gabarito e comentário

GabaritoC — aplicar p.situacao = 'CONFIRMADO' na cláusula ON do LEFT JOIN com T_PAGAMENTO.

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: LEFT JOIN e filtro de condição na cláusula ON

Gabarito: letra C. Para listar todas as NF-e autorizadas mesmo sem pagamento associado e considerar apenas pagamentos com situacao = 'CONFIRMADO', a condição sobre p.situacao deve ser aplicada na cláusula ON do LEFT JOIN. Isso preserva as linhas da tabela à esquerda (T_NFE) que não têm correspondência em T_PAGAMENTO, preenchendo com NULL os campos de pagamento — exatamente o comportamento desejado.

O LEFT JOIN (junção externa à esquerda) retorna todas as linhas da tabela à esquerda (T_NFE) e apenas as linhas correspondentes da tabela à direita (T_PAGAMENTO). Quando não há correspondência, os campos da tabela à direita são preenchidos com NULL. A questão central é: onde colocar o filtro p.situacao = 'CONFIRMADO' para não eliminar as NF-e sem pagamento?

A regra fundamental é: condições na cláusula ON são aplicadas durante a junção, antes de decidir quais linhas da tabela preservada entram no resultado; condições na cláusula WHERE são aplicadas após a junção, filtrando o resultado final. Portanto, se o filtro for colocado no WHERE, as linhas com NULL (NF-e sem pagamento) serão eliminadas, pois NULL = 'CONFIRMADO' não é verdadeiro — é desconhecido (unknown). Isso quebraria o requisito de listar todas as NF-e autorizadas.

Vamos ilustrar com um exemplo concreto. Suponha a tabela T_NFE:

id_nfe

autorizada

1

S

2

S

3

N

E a tabela T_PAGAMENTO:

id_pag

id_nfe

situacao

10

1

CONFIRMADO

11

1

PENDENTE

12

2

CANCELADO

Com LEFT JOIN e filtro no ON:

SELECT *
FROM T_NFE n
LEFT JOIN T_PAGAMENTO p ON n.id_nfe = p.id_nfe AND p.situacao = 'CONFIRMADO'
WHERE n.autorizada = 'S'

Resultado:

id_nfe

autorizada

id_pag

id_nfe

situacao

1

S

10

1

CONFIRMADO

2

S

NULL

NULL

NULL

A NF-e 2 aparece mesmo sem pagamento confirmado. Já com o filtro no WHERE:

SELECT *
FROM T_NFE n
LEFT JOIN T_PAGAMENTO p ON n.id_nfe = p.id_nfe
WHERE n.autorizada = 'S' AND p.situacao = 'CONFIRMADO'

Resultado:

id_nfe

autorizada

id_pag

id_nfe

situacao

1

S

10

1

CONFIRMADO

A NF-e 2 foi eliminada porque NULL = 'CONFIRMADO' não é verdadeiro. Essa é a pegadinha clássica: o candidato sabe que precisa de LEFT JOIN, mas coloca o filtro no lugar errado.

A distinção entre ON e WHERE em junções externas é o critério decisivo desta questão. No INNER JOIN, colocar a condição no ON ou no WHERE produz o mesmo resultado, pois não há linhas preservadas. Mas em junções externas (LEFT, RIGHT, FULL), a posição do filtro muda completamente o conjunto de resultados.

Guarde esta regra de ouro: em LEFT JOIN, o filtro sobre a tabela à direita vai no ON; o filtro sobre a tabela à esquerda pode ir no WHERE. É exatamente nessa fronteira que as alternativas se dividem.

1No ON
Preserva linhas sem correspondência
Condição avaliada durante a junção
2No WHERE
Elimina linhas com NULL
NULL = 'CONFIRMADO' é desconhecido
3Regra de ouro
Tabela direita → ON
Tabela esquerda → WHERE
LEFT JOIN: filtro da tabela direita
LEVELsoulevel.com.br
LEFT JOIN: filtro da tabela direita: No ON (Preserva linhas sem correspondência, Condição avaliada durante a junção); No WHERE (Elimina linhas com NULL, NULL = 'CONFIRMADO' é desconhecido); Regra de ouro (Tabela direita → ON, Tabela esquerda → WHERE)

Alternativa A — ❌ Incorreta

Usar RIGHT JOIN preservando T_PAGAMENTO inverteria a lógica: o RIGHT JOIN preserva todas as linhas da tabela à direita (T_PAGAMENTO), não as da esquerda (T_NFE). O requisito é listar todas as NF-e, então a tabela preservada deve ser T_NFE, o que exige LEFT JOIN (ou RIGHT JOIN com as tabelas invertidas). Além disso, filtrar p.situacao no WHERE eliminaria as NF-e sem pagamento, como explicado.

Alternativa B — ❌ Incorreta

O FULL OUTER JOIN retorna todas as linhas de ambas as tabelas, preenchendo com NULL onde não há correspondência. Embora preserve as NF-e sem pagamento, filtrar p.situacao no WHERE ainda eliminaria essas linhas, pois NULL = 'CONFIRMADO' não é verdadeiro. O FULL OUTER JOIN seria útil se fosse necessário listar também pagamentos sem NF-e, mas o requisito é apenas listar todas as NF-e, o que o LEFT JOIN já faz de forma mais simples e eficiente.

Alternativa C — ✅ Correta ⟵ GABARITO

Aplicar p.situacao = 'CONFIRMADO' na cláusula ON do LEFT JOIN é exatamente a solução. A condição é avaliada durante a junção: para cada NF-e, o banco procura pagamentos correspondentes que também tenham situacao = 'CONFIRMADO'. Se não encontrar, a NF-e ainda é incluída no resultado com campos de pagamento NULL. Isso atende perfeitamente ao requisito de listar todas as NF-e autorizadas, mesmo sem pagamento associado, considerando apenas pagamentos confirmados.

Alternativa D — ❌ Incorreta

Aplicar p.situacao = 'CONFIRMADO' na cláusula WHERE após o LEFT JOIN é o erro clássico. O WHERE filtra o resultado final da junção, e como NULL = 'CONFIRMADO' não é verdadeiro, todas as NF-e sem pagamento confirmado seriam eliminadas. O resultado conteria apenas NF-e que possuem pagamento confirmado, violando o requisito de listar todas as NF-e autorizadas.

Alternativa E — ❌ Incorreta

Substituir o LEFT JOIN por INNER JOIN descartaria automaticamente as NF-e sem pagamento, pois o INNER JOIN retorna apenas linhas com correspondência em ambas as tabelas. Mesmo mantendo o predicado no ON, o INNER JOIN não preserva linhas sem par, então NF-e sem pagamento não apareceriam no resultado. O requisito exige explicitamente listar todas as NF-e, mesmo sem pagamento, o que só é possível com uma junção externa.

NÃO CAIA NESSA!

A banca explora a confusão entre ON e WHERE em junções externas. Muitos candidatos sabem que precisam de LEFT JOIN, mas colocam o filtro no WHERE, eliminando as NF-e sem pagamento. A regra é: em LEFT JOIN, o filtro sobre a tabela à direita vai no ON; o filtro sobre a tabela à esquerda pode ir no WHERE. Memorize isso e você não cairá mais nessa armadilha.

PEGA ESSA DICA!

Para resolver questões de JOIN, identifique primeiro qual tabela deve ser preservada (todas as linhas). Se for a da esquerda, use LEFT JOIN; se for a da direita, use RIGHT JOIN. Depois, pergunte-se: o filtro é sobre a tabela preservada ou sobre a outra? Se for sobre a outra, coloque no ON. Se for sobre a preservada, pode ir no WHERE. Essa sequência resolve a maioria das questões.

Gabarito: letra C

Link permanente: /questoes/fc142293