如何在Postgresql中更高效地编写多个EXISTS子查询

问题描述 投票:0回答:1

我正在查询我的数据库,其中工作流程在相关表中具有多个特定属性。我已经设法编写了一个可以正确获取结果的查询,但它使用多个子查询,并且我确信有一种更有效的方法来编写它。

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); 

我如何重写它以仅使用一个子查询,或连接而不是子查询?

sql postgresql subquery
1个回答
0
投票

您可以使用使用 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)无论如何都会被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.