问题
I am not getting the output as expected, because
AND ta.task_status_type_id NOT IN ( 10 )
is not working in below query.
SELECT
ta.task_id AS id,
u.employee_id AS employee_id,
ta.task_status_type_id
FROM
task_assignments AS ta,
users AS u
WHERE
u.id = ta.user_id
AND ta.id IN (
SELECT
max ( ta.id ) OVER ( partition BY ta.task_id ) AS id
FROM
task_details AS td,
task_assignments AS ta
WHERE
td.task_id = ta.task_id
AND td.developer_employee_id IS NULL
AND ta.task_type_id IN(6,7)
AND ta.task_status_type_id NOT IN ( 10 )
AND ta.task_status_type_id IN ( 9 )
);
Please help in resolving the error.
回答1:
An educated guess (for lack of more information):
NOT IN (...) returns NULL if any NULL values are involved and the tested value is not in the list. But only TRUE qualifies in a WHERE clause.
a NOT IN (b,c)
is transformed to:
a <> ALL ('{b,c}'::sometype[])
equivalent to:
(a <> b AND a <> c )
If any of these values (on either side of the operator) is NULL, you get:
(NULL AND FALSE)
That's:
NULL
And NULL is equivalent to FALSE in a WHERE clause. Only TRUE qualifies.
This has been known to cause disbelieve in users unfamiliar with tri-valued logic.
Use IS DISTINCT FROM or NOT EXISTS instead. Or LEFT JOIN / IS NULL.
Example (more guesswork)
In this particular case, you don't need the incriminated expression at all
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
)
If you are secretly using a list of values to be excluded that could share elements with the inclusion list:
...
AND (ta.task_status_type_id IN ( ... )) IS NOT TRUE
...
Or you weed out NULL values.
Or you avoid common elements in inclusion and exclusion list.
来源:https://stackoverflow.com/questions/19517899/not-in-in-postgresql-not-working