Eine fundierte Vermutung (mangels weiterer Informationen):
NOT IN (...)
gibt NULL
zurück falls vorhanden NULL
Werte beteiligt sind und der getestete Wert nicht in der Liste enthalten ist. Aber nur TRUE
qualifiziert sich in einem WHERE
Klausel.
a NOT IN (b,c)
wird umgewandelt in:
a <> ALL ('{b,c}'::sometype[])
Äquivalent zu:
(a <> b AND a <> c )
Falls irgendwelche dieser Werte (auf beiden Seiten des Operators) ist NULL
, erhalten Sie:
(NULL AND FALSE)
Das ist:
NULL
Und NULL
entspricht FALSE
in einem WHERE
Klausel. Nur TRUE
qualifiziert.
Es ist bekannt, dass dies bei Benutzern, die mit dreiwertiger Logik nicht vertraut sind, Unglauben hervorruft.
Verwenden Sie IS DISTINCT FROM
oder NOT EXISTS
stattdessen. Oder LEFT JOIN / IS NULL
.
Beispiel (mehr Vermutungen)
In diesem speziellen Fall brauchen Sie den inkriminierten Ausdruck überhaupt nicht
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
)
Wenn Sie heimlich eine Liste von auszuschließenden Werten verwenden, die Elemente mit der Einschlussliste teilen könnten:
...
AND (ta.task_status_type_id IN ( ... )) IS NOT TRUE
...
Oder Sie sortieren NULL-Werte aus.
Oder Sie vermeiden gemeinsame Elemente in Ein- und Ausschlusslisten.