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.