mysql - 在 MySQL 中使用 JOIN 优化这些嵌套的 IN 语句
问题描述
我正在编写一个查询以从表中排除特定的员工组。假设我有表 1,transaction_details,其中包含我想要选择的信息。表 2,employee_task_associations,将每个员工映射到他们在特定日期分配的任务。它有一个employee_id 字段和一个map_id 字段,它是不同任务的id。该表是关联表,因此表 1 和表 3 可以具有多对多关系。表 3,employee_tasks,列出了员工可以拥有的所有任务。
我写了这个查询,它是功能性的,但没有优化:
SELECT someInfo FROM transaction_details TD
WHERE TD.employee_id NOT IN
(SELECT employee_id from employee_task_associations ETA
WHERE map_id IN
(SELECT id FROM employee_tasks ET
WHERE ET.taskName = "The task I want to exclude"))
虽然这有效,但它将运行多个查询。我想通过用 JOINS 替换嵌套的 NOT IN 和 IN 语句来加快速度。
我知道我可以用以下内容替换底部的四行:
SELECT employee_id FROM employee_task_assocations ETA
LEFT OUTER JOIN employee_tasks ET
ON ETA.map_id = ET.id
WHERE ET.taskName = "The task I want to exclude"
这将返回完成此任务的员工的所有 ID 的列表。我想通过使用 JOIN 而不是子查询,从 transaction_details 中的 SELECT 语句中排除这些。我尝试使用 ETA.id IS NULL 的 LEFT OUTER JOIN,但这不起作用。在这种情况下,如何使用 JOIN 排除某些员工?
解决方案
您似乎很接近您的初始查询,但为什么不加入 NOT IN 查询并获得不同的员工......像
SELECT
TD.someInfo
FROM
transaction_details TD
WHERE
TD.employee_id NOT IN
(SELECT DISTINCT
employee_id
from
employee_task_associations ETA
JOIN employee_tasks ET
ON ETA.map_id = ET.ID
AND ET.taskName = "The task I want to exclude")
推荐阅读
- r - 使用 golem 包运行应用时的 golem_opts 示例
- javascript - 使用 javascript/css 平滑导航栏
- ruby-on-rails - 仅用于发布请求的 Rails api 应用程序的 InvalidAuthenticityToken
- javascript - 使用 Redux 状态初始化 Axios 客户端
- python - Jupyter Notebook 中是否缺少错误突出显示和自动完成功能?
- android - 播放某些文件后媒体播放器停止工作
- c - 0.00 和 -0.00 的 C 错误
- apache-spark - 在将数据帧写入镶木地板时指定最大文件大小
- java - 从 Set 中删除负值
- cqrs - 如何在使用 CQRS 和事件源的偶尔连接的系统上选择将哪些事件发送给用户?