我没有按预期获得输出,因为
AND ta.task_status_type_id NOT IN ( 10 )
在以下查询中无效。
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 ) );
请帮助解决错误。
答案 0 :(得分:6)
有根据的猜测(缺乏更多信息):
如果涉及任何NOT IN (...)
值并且测试值不在列表中,则 NULL
会返回 NULL
。但只有TRUE
符合WHERE
条款。
a NOT IN (b,c)
转换为:
a <> ALL ('{b,c}'::sometype[])
相当于:
(a <> b AND a <> c )
如果 这些值中的任何 (在运算符的任一侧)为NULL
,则会得到:
(NULL AND FALSE)
这是:
NULL
并且NULL
相当于FALSE
子句中的WHERE
。只有TRUE
符合条件。
众所周知,这会导致不熟悉tri-valued logic的用户不相信。
改为使用IS DISTINCT FROM
或NOT EXISTS
。或LEFT JOIN / IS NULL
。
在这种特殊情况下,你根本不需要有罪的表达
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
)
如果您秘密使用要排除的值列表,可以与包含列表共享元素:
...
AND (ta.task_status_type_id IN ( ... )) IS NOT TRUE
...
或者你清除了NULL值 或者您在包含和排除列表中避免使用常见元素。