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

Does using a query inside a select statement execute that query for every row?

我使用 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

它从我的数据库中选择所有职位,运行检查当前登录的用户(在本例中 ID 为 774)是否已申请该职位。

我在数据库 GUI 中只看到一个查询 运行,但这不是 运行 jobs table 中每一行的嵌套查询吗?

有没有更好的写法?或者这看起来像是应该通过比较来自两个单独查询的数据集来完成的事情吗?

您可以使用左连接来编写:

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 语法在 Postgres 上实际上是有效的,假设 jobs.id 是那个 table 的主键。在这种情况下,jobs.* 是在功能上都依赖于 jobs.id.

的列

您可以简单地执行 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;

强烈推荐使用EXISTS。您可以 return 将值作为 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) 上的索引,应该没有更快的方法来处理查询。