【发布时间】:2020-04-06 02:57:11
【问题描述】:
我使用 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 表中的每一行运行嵌套查询吗?
有没有更好的方法来写这个?或者这似乎应该通过比较来自两个单独查询的数据集来完成?
【问题讨论】:
-
"这不是必须为每一行运行嵌套查询" 不,它只需要返回 SQL 描述的行。阅读有关一般性和 DBMS 的关系查询实现/优化的基础知识。这些是常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
-
不清楚您所说的“在我的数据库 GUI 中只看到一个查询”是什么意思。但是这里有一个查询表达式,其中包含一个子查询作为子表达式,因此无论在查询表达式转换为代码后,任何一段实现代码重复运行的频率如何,都只会运行一个查询。了解 SQL EXPLAIN、查询计划等。
-
查看执行计划。如果将其重写为左连接,我不会感到惊讶
标签: sql postgresql query-performance