Quero que a lista do campo de aluno liste todos os alunos que sejam da turma e ainda não constem na lista de faltas dessa turma. Porém, ao usar a cláusula NOT EXISTS o select dá problema, exibindo o id (primeiro campo) no lugar do nome (segundo campo usado como rótulo). Vejam:
#1 - o select para todos os alunos da turma, que funciona perfeitamente, exibindo o nome (nm_aluno) e gravando o ID (id_aluno):
SELECT a.id_aluno , a.nm_aluno
FROM aluno a
INNER JOIN turma_aluno ta ON ta.id_aluno = a.id_aluno
WHERE ta.id_turma = [ii_id_turma]
ORDER BY a.nm_aluno
#2 - agora o mesmo select, mas com a inclusão do NOT EXISTS no WHERE para não exibir alunos que já estejam na tabela de faltas, evitando a duplicidade e consequente erro de chave única
SELECT a.id_aluno , a.nm_aluno
FROM aluno a
INNER JOIN turma_aluno ta ON ta.id_aluno = a.id_aluno
WHERE ta.id_turma = [ii_id_turma]
AND not exists (SELECT 1 FROM falta f WHERE f.id_aluno = a.id_aluno AND f.id_turma = [ii_id_turma])
ORDER BY a.nm_aluno
#3 - agora o mesmo select do #2, mas usando o IN (menos performático) ao invés do NOT EXISTS (mais performático), mas que produz o mesmo efeito nesse caso, para ver se funciona
SELECT a.id_aluno , a.nm_aluno
FROM aluno a
INNER JOIN turma_aluno ta ON ta.id_aluno = a.id_aluno
WHERE ta.id_turma = [ii_id_turma]
AND a.id_aluno NOT IN (SELECT f.id_aluno FROM falta f WHERE f.id_turma = [ii_id_turma])
ORDER BY a.nm_aluno
Tanto nas soluções 2 e 3 tive problemas com Bug do SC. O que ocorre é que ele exibe o id_aluno a invés do nm_aluno na recuperação do registros já existentes ao abrir a aplicação e a lista de alunos do combobox fica vazia ao inserir um registro novo ou alterar um existente, sendo que existem registros (alunos) a serem exibidos.