gpt4 book ai didi

sql - LEFT OUTER JOIN PostgreSQL 用作 INNER JOIN?

转载 作者:行者123 更新时间:2023-11-29 12:34:59 24 4
gpt4 key购买 nike

以下查询正常运行

SELECT "employee"."id",
"employee"."created",
(SELECT SUM(minutes) FROM jobs_job AS job WHERE job.employee_id = employee.id AND job.job_date BETWEEN '2018-10-21' AND '2018-10-30')
FROM users_employee AS employee
INNER JOIN users_user AS users ON (employee.user_id = users.id)
WHERE NOT ("users"."status" = 'F')
GROUP BY
employee.id

然后我得到了正确的数据(对于在 JOB 表中没有记录的人来说是 NULL

但是,如果我将相同的查询重构为 LEFT OUTER JOIN

SELECT "employee"."id",
"employee"."created",
SUM(job.minutes) AS job_minutes
FROM users_employee AS employee
INNER JOIN users_user AS users ON (employee.user_id = users.id)
LEFT OUTER JOIN jobs_job AS job on employee.id = job.employee_id
WHERE NOT ("users"."status" = 'F') AND job.job_date BETWEEN '2018-10-21' AND '2018-10-30'
GROUP BY
employee.id

我在原始查询中得到 112 行而不是 142 并且只有 Job 表中存在的记录

最佳答案

提供的所有答案都将帮助您修复代码。我只想详细说明为什么它们会起作用。

SQL 引擎首先评估您的FROM 和您的JOIN,将您的初始数据集拉入内存。那时,因为您使用了 LEFT OUTER JOIN,所以您期望的所有行仍然存在。

之后,它应用您的 WHERE 子句。在这种情况下,您的 WHERE 子句包含 job.job_date BETWEEN '2018-10-21' AND '2018-10-30',因此此时引擎会过滤掉所有不符合该条件的行。这有效地使 LEFT JOIN 的结果与使用 INNER JOIN 获得的结果完全相同。

最好的答案是将过滤条件移到您的 ON 子句中,这已被多次提出。另一种可行的方法是将 IS NULL 可能性添加到您现有的 WHERE 子句中:IS NULL 可能性/p>

...
WHERE
NOT ("users"."status" = 'F')
AND
(
(job.job_date BETWEEN '2018-10-21' AND '2018-10-30')
OR
job.job_date IS NULL
)

不过,在 JOIN 上使用条件会执行得更好,因为您首先将更少的记录拉入内存。

关于sql - LEFT OUTER JOIN PostgreSQL 用作 INNER JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53064426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com