Um palpite (por falta de mais informações):
NOT IN (...) retorna NULL se houver NULL valores estão envolvidos e o valor testado não está na lista. Mas apenas TRUE qualifica em um WHERE cláusula. a NOT IN (b,c)
é transformado em:
a <> ALL ('{b,c}'::sometype[])
equivalente a:
(a <> b AND a <> c )
Se qualquer desses valores (em ambos os lados do operador) é
NULL , você obtém:(NULL AND FALSE)
Isso é:
NULL
E
NULL é equivalente a FALSE em um WHERE cláusula. Apenas TRUE qualifica. Isso é conhecido por causar descrença em usuários não familiarizados com lógica de três valores.
Use
IS DISTINCT FROM ou NOT EXISTS em vez de. Ou LEFT JOIN / IS NULL . Exemplo (mais suposições)
Neste caso específico, você não precisa da expressão incriminada de forma alguma
SELECT ta.task_id AS id
, u.employee_id
, ta.task_status_type_id
FROM task_assignments ta
JOIN users u ON u.id = ta.user_id
WHERE ta.id IN (
SELECT max(ta.id) AS id
FROM task_details td
JOIN task_assignments ta USING (task_id)
WHERE td.developer_employee_id IS NULL
AND ta.task_type_id IN (6,7)
-- AND ta.task_status_type_id IS DISTINCT FROM 10 -- just cruft
AND ta.task_status_type_id = 9 -- this expression covers it
GROUP BY ta.task_id
)
Se você estiver usando secretamente uma lista de valores a serem excluídos que podem compartilhar elementos com a lista de inclusão:
...
AND (ta.task_status_type_id IN ( ... )) IS NOT TRUE
...
Ou você elimina valores NULL.
Ou você evita elementos comuns na lista de inclusão e exclusão.