我正在尝试编写查询以查找链接到非当前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';
我真的觉得我在这里遗漏了什么,有什么建议吗?
答案 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);
希望,它提供了预期的数据。