Veja se funciona
SELECT b.filial, b.mat, b.sitfolha, b.admissao, b.cpf, b.rg
FROM
(SELECT MAX(RECNO) "UltRecno", CPF FROM FUNCIONARIOS WHERE SITFOLHA != 'D' GROUP BY CPF) a,
FUNCIONARIOS b
WHERE
A.UltRecno = b.recno
AND a.cpf = b.cpf
AND b.rescrai '31'
AND b.mat between '100000' and '899999'
AND b.demissao > '20100000'
AND b.catfunc IN ('I','J','M');
Olha, pra mim não faz sentido algum você pegar todos que não são DEMITIDOS e no final AND b.demissao > ‘20100000’ , pega todos que são demitidos. Essa view nunca será verdadeira, sempre retornará 0 linhas se por acaso você preencher eventualmente o campo DEMISSAO quando alguem é demitido.
São campos conflitantes:
1) alguem é demitido …
2) seta SITFOLHA = ‘D’
3) seta DEMISSAO = sysdate