MYSQL查询上出现奇怪的空集结果

时间:2015-02-05 08:41:47

标签: mysql

我正在尝试编写查询以查找链接到非当前pma的所有PMA任务。我们遵循不同任务类型(entity_task表)的单表继承。所有当前的pma id都存储在employee表中。

我的第一次尝试如下:

SELECT * FROM entity_task 
WHERE dtype = 'PMATask'
AND pma_id NOT IN (SELECT pma_id FROM employee);

我希望这会返回链接到非当前PMA的所有任务,但它只返回一个空集。

实体任务表结构如下

+---------------------------+-------------+------+-----+--------------------+----------------+
| Field                     | Type        | Null | Key | Default            | Extra          |
+---------------------------+-------------+------+-----+--------------------+----------------+
| id                        | bigint(20)  | NO   | PRI | NULL               | auto_increment |
| date_created              | datetime    | NO   |     | NULL               |                |
| version                   | int(11)     | NO   |     | NULL               |                |
| employee_course_id        | bigint(20)  | YES  | MUL | NULL               |                |
| task_id                   | bigint(20)  | NO   | MUL | NULL               |                |
| tenant_id                 | bigint(20)  | YES  | MUL | NULL               |                |
| date_updated              | datetime    | YES  |     | NULL               |                |
| dtype                     | varchar(31) | NO   |     | EmployeeCourseTask |                |
| meeting_id                | bigint(20)  | YES  | MUL | NULL               |                |
| pma_id                    | bigint(20)  | YES  | MUL | NULL               |                |
| critical_talent_review_id | bigint(20)  | YES  | MUL | NULL               |                |
| working_week_id           | bigint(20)  | YES  | MUL | NULL               |                |
| leave_form_id             | bigint(20)  | YES  | MUL | NULL               |                |
| leave_adjustment_id       | bigint(20)  | YES  | MUL | NULL               |                |
| remuneration_run_id       | bigint(20)  | YES  | MUL | NULL               |                |
+---------------------------+-------------+------+-----+--------------------+----------------+

我们终于通过使用以下查询设法将所有任务链接到非当前PMA

SELECT et.id 
FROM entity_task et 
LEFT JOIN employee e ON et.pma_id = e.pma_id 
WHERE e.pma_id IS NULL 
AND et.dtype = 'PMATask';

我真的觉得我在这里遗漏了什么,有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您的2个查询不等同,第一个查询在entity_task中检查所有 pma_id,这在员工中不存在。

第二个通过添加JOIN条件来检查相同的事情,entity_task中的所有pma_id在员工中都不存在,但仅适用于et.pma_id = e.pma_id的每个子集。

这是重写第一个将此考虑在内的查询

SELECT * FROM entity_task 
WHERE dtype = 'PMATask'
AND pma_id NOT EXISTS(SELECT pma_id FROM employee WHERE employee.pma_id=entity_task.pma_id);

答案 1 :(得分:0)

非当前pma_id在Employee表中将为null,因此您可能需要在第一个查询中包含该条件

SELECT * FROM entity_task 
WHERE dtype = 'PMATask'
AND pma_id NOT IN (SELECT pma_id FROM employee where pma_id is NULL);

希望,它提供了预期的数据。