Postgresql中的NOT IN无法正常工作
我没有得到预期的输出,因为
AND ta.task_status_type_id NOT IN(10)
在下面的查询中不起作用。
选择 ta.task_id AS ID,
u.employee_id AS员工ID,
ta.task_status_type_id
从
task_assignments AS ta,
使用者AS u
在哪里
u.id = ta.user_id
AND ta.id IN(
选择
max(ta.id)OVER(partition by ta.task_id)AS ID
从
task_details AS td,
task_assignments AS ta
在哪里
td.task_id = ta.task_id
AND td.developer_employee_id为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)
);
请协助解决错误。
回答:
有根据的猜测(由于缺乏更多信息):
返回
如果任何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
符合条件。
众所周知,这会使不熟悉三值逻辑的用户难以置信。
使用IS DISTINCT
FROM或 代替。或者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值。
或者您避免在包含和排除列表中使用公共元素。
以上是 Postgresql中的NOT IN无法正常工作 的全部内容, 来源链接: utcz.com/qa/406647.html