-2

我没有得到预期的输出,因为

AND ta.task_status_type_id 不在(10)

在以下查询中不起作用。

选择
    ta.task_id AS id,
    u.employee_id ASemployee_id,
    ta.task_status_type_id
从
    task_assignments AS ta,
    用户作为你
在哪里
    u.id = ta.user_id
    和 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
                       并且 td.developer_employee_id 为空
                       AND ta.task_type_id IN(6,7)
                       AND ta.task_status_type_id 不在(10)
                       AND ta.task_status_type_id IN (9)


    );

请帮助解决错误。

4

1 回答 1

15

有根据的猜测(由于缺乏更多信息):

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

andNULL相当于FALSE在一个WHERE子句中。只有TRUE合格。

众所周知,这会导致不熟悉三值逻辑的用户不相信。

使用IS DISTINCT FROMNOT 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 值。
或者您避免包含和排除列表中的常见元素。

于 2013-10-22T21:28:42.520 回答