在select语句中使用查询是否对每一行都执行该查询?

时间:2020-04-06 02:57:11

标签: sql postgresql query-performance

使用Postgres,我编写了以下查询:

SELECT 
    *,
    CASE 
        WHEN
            (SELECT count(*) FROM applications WHERE applications.user_id = 774 AND applications.job_id = jobs.id) > 0
        THEN 1 
        ELSE 0 
    END 
    AS has_applied 
FROM jobs

它从我的数据库中选择所有作业,并运行检查以查看当前登录的用户(在这种情况下,标识为774)是否已应用于该作业。

我仅在数据库GUI中运行一个查询,但这不是必须对jobs表中的每一行运行嵌套查询吗?

有没有更好的方法来写这个?还是应该通过比较两个独立查询的数据集来完成这项工作?

3 个答案:

答案 0 :(得分:1)

您可以使用左联接来编写此代码:

SELECT
    j.*,
    CASE WHEN COUNT(CASE WHEN a.user_id = 774 THEN 1 END) > 0
         THEN 1 ELSE 0 END AS has_applied
FROM jobs j
LEFT JOIN applications a
    ON j.id = a.job_id
GROUP BY
    j.id;

请注意,假设GROUP BY是该表的主键,上述jobs.id语法实际上对Postgres有效。在这种情况下,jobs.*是在功能上都依赖于jobs.id的列。

答案 1 :(得分:1)

您可以简单地执行LEFT JOIN

SELECT j.*, (CASE WHEN a.job_id IS NULL THEN 0 ELSE 1 END) AS has_applied
FROM jobs j LEFT JOIN
     applications a
     ON a.job_id = j.id AND a.user_id = 774;

答案 2 :(得分:0)

强烈建议使用EXISTS。您可以在Postgres中将值作为布尔值返回,所以:

SELECT j.*,
       (EXISTS (SELECT 1
                FROM applications a
                WHERE a.job_id = j.id AND a.user_id = 774 
       ) as has_applied
FROM jobs j;

使用applications(job_id, user_id)上的索引,应该没有更快的方法来处理查询。