Um Auditor de uma Prefeitura está analisando o banco de dados do sistema responsável por gerenciar pagamentos realizados aos fornecedores. O sistema utiliza o modelo de dados relacional e apresenta a seguinte estrutura:

O Auditor deseja listar todos os pagamentos realizados, exibindo o NomeFornecedor, o CNPJ e o Valor Pagamento. É necessário relacionar as tabelas Pagamentos e Fornecedores, com base no modelo de dados relacional, para obter as informações corretamente.
A consulta SQL correta para essa auditoria é:
A
SELECT p . NomeFornecedor, f .CNPJ, p . Valor Pagamento FROM Pagamentos p JOIN Fornecedores f ON p . IDFornecedor = f . IDPagamento;
B
SELECT f . NomeFornecedor , f . CNPJ, p . Valor Pagamento FROM Pagamentos p FULL JOIN Fornecedores f ;
C
SELECT f . NomeFornecedor, f .CNPJ, p .Valor Pagamento FROM Pagamentos p INNER JOIN Fornecedores f ON p . IDFornecedor = f . IDFornecedor;
D
SELECT NomeFornecedor, CNPJ, Valor Pagamento FROM Pagamentos , Fornecedores ;
E
SELECT f . NomeFornecedor, f . CNPJ , p .Valor Pagamento FROM Pagamentos p LEFT JOIN Fornecedores f ON p .IDPagamento = f . IDFornecedor;
Por que a alternativa C está correta?
O comando da alternativa C faz a junção exata das informações solicitadas seguindo a lógica do modelo relacional:
- A Seleção das Colunas (
SELECT):SELECT f.NomeFornecedor, f.CNPJ, p.ValorPagamentoO auditor quer essas três informações. O prefixof.ep.(os aliases ou apelidos) indica corretamente de onde cada dado vem: Nome e CNPJ vêm da tabela de Fornecedores (f), enquanto o Valor vem da tabela de Pagamentos (p). - A Junção (
INNER JOIN):FROM Pagamentos p INNER JOIN Fornecedores fIsso indica que queremos juntar os dados das duas tabelas, retornando apenas as linhas onde houver correspondência entre elas. - A Condição de Relacionamento (
ON):ON p.IDFornecedor = f.IDFornecedorEste é o ponto crucial! Para saber qual fornecedor recebeu qual pagamento, precisamos igualar a chave estrangeira na tabela de pagamentos (p.IDFornecedor) com a chave primária na tabela de fornecedores (f.IDFornecedor). A alternativa C faz isso perfeitamente.
Por que as outras alternativas estão incorretas?
Como é típico nas provas da FCC, as opções incorretas misturam as colunas, esquecem cláusulas ou ligam as chaves erradas. Veja os erros:
- A: ❌ Erros de origem e de chaves. Primeiro, no
SELECT, ela pedep.NomeFornecedor(mas o nome do fornecedor está na tabelaf, e não nap). Segundo, na condiçãoON, ela tenta ligarp.IDFornecedorcomf.IDPagamento(a tabela Fornecedores sequer possui uma coluna chamada IDPagamento). - B: ❌ Falta a condição de junção. A alternativa usa
FULL JOINmas "esquece" de colocar a cláusulaONpara dizer como as tabelas se relacionam. Sem oON, o banco de dados não sabe como cruzar os dados, o que geraria um erro de sintaxe. - D: ❌ Produto Cartesiano. Ao colocar as duas tabelas no
FROMseparadas por vírgula e sem nenhuma cláusulaWHEREpara ligar os IDs, o banco de dados fará um "produto cartesiano". Ou seja, ele vai misturar todos os pagamentos com todos os fornecedores, gerando milhares de linhas incorretas. Se o João recebeu 100 reais, o sistema diria que todos os fornecedores cadastrados receberam aqueles mesmos 100 reais. - E: ❌ Relacionamento sem sentido. A cláusula
ONestá errada. Ela tenta ligarp.IDPagamento = f.IDFornecedor. O ID do Pagamento não tem nada a ver com o ID do Fornecedor. É como tentar cruzar o número de uma nota fiscal com o CPF de uma pessoa; os números não vão bater e a consulta não trará o resultado correto.