【发布时间】:2016-05-01 05:14:21
【问题描述】:
这里是 2 个表格的简化描述:
CREATE TABLE jobs(id PRIMARY KEY, description);
CREATE TABLE dates(id PRIMARY KEY, job REFERENCES jobs(id), date);
每个工作可能有一个或多个日期。
我想创建一个生成以下内容的查询(在 pidgin 中):
jobs.id, jobs.description, min(dates.date) as start, max(dates.date) as finish
我尝试过这样的事情:
SELECT id, description,
(SELECT min(date) as start FROM dates d WHERE d.job=j.id),
(SELECT max(date) as finish FROM dates d WHERE d.job=j.id)
FROM jobs j;
可行,但看起来效率很低。
我尝试了INNER JOIN,但看不到如何将jobs 与dates 上的合适聚合查询结合起来。
谁能提出一个干净有效的方法来做到这一点?
【问题讨论】:
-
您可以聚合已经加入的“表”。很可能会使用
GROUP BY。 -
@PM77-1 类似这样的东西:
SELECT min(jobs.id),min(jobs.description), min(dates.date) AS start, max(dates.data) AS finish FROM obs INNER JOIN dates ON jobs.id=dates.job GROUP BY jobs.id。我想到了这一点,但想知道将min用于job项目是否浪费。 -
您不必汇总用于分组的字段。
-
@PM77-1 你是对的,当然。更正后的语句为:
SELECT jobs.id,min(jobs.description), min(dates.date) AS start, max(dates.data) AS finish FROM obs INNER JOIN dates ON jobs.id=dates.job GROUP BY jobs.id。但是,在我的实际应用程序中,jobs表中还有其他字段也需要列出,类似于上面的description。 -
与往常一样,应该声明您的 Postgres 版本。
标签: sql postgresql subquery inner-join aggregate