Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026
Banco de Dados›Consultas 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 é
Ausar RIGHT JOIN preservando T_PAGAMENTO e filtrar p.situacao no WHERE.
Busar FULL OUTER JOIN e filtrar p.situacao no WHERE para manter o conjunto.
Caplicar p.situacao = 'CONFIRMADO' na cláusula ON do LEFT JOIN com T_PAGAMENTO.
Daplicar p.situacao = 'CONFIRMADO' na cláusula WHERE após o LEFT JOIN.
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.
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.