我正在查询我的数据库,其中工作流程在相关表中具有多个特定属性。我已经设法编写了一个可以正确获取结果的查询,但它使用多个子查询,并且我确信有一种更有效的方法来编写它。
SELECT *
FROM workflow w
WHERE EXISTS (SELECT ti.id
FROM task_instance ti
left join workflow_task_instance wti
ON ti.id = wti.task_instance_id
WHERE ti.task_type = 'TASK_ONE'
AND wti.workflow_id = w.id)
AND EXISTS (SELECT ti.id
FROM task_instance ti
left join workflow_task_instance wti
ON ti.id = wti.task_instance_id
WHERE ti.task_type = 'TASK_TWO'
AND wti.workflow_id = w.id);
我如何重写它以仅使用一个子查询,或连接而不是子查询?
您可以使用使用 group by 子句和后续having子句的单个子查询来计算哪些workflow_ids具有两种task_types。虽然您可以继续使用这个单一子查询方法中的存在,但内部联接似乎是更直接的路线。
SELECT w.*
FROM workflow w
INNER JOIN (
SELECT wti.workflow_id
FROM task_instance ti
INNER JOIN workflow_task_instance wti ON ti.id = wti.task_instance_id
WHERE ti.task_type IN ('TASK_ONE', 'TASK_TWO')
GROUP BY wti.workflow_id
HAVING COUNT(DISTINCT ti.task_type) = 2
) subquery ON w.id = subquery.workflow_id
nb 在子查询中使用左连接是没有意义的,因为不匹配的行(在workflow_id 列中生成 NULL)无论如何都会被忽略。