绕过约束“列必须出现在 GROUP BY 子句中或用于聚合函数中”

Mig*_*ell 7 postgresql join aggregate group-by

我正在使用 Postgres,它强制执行 SELECT...GROUP BY 中的所有列必须出现在 GROUP BY 子句中或在聚合函数中使用的约束。

假设我正在为人们的汽车建模,我想算出一个人的姓名、牌照号码以及他们拥有的汽车数量。这是我作为SQL Fiddle 的示例。

我会有以下架构:

CREATE TABLE person(
  id integer PRIMARY KEY,
  name text
);

CREATE TABLE license(
  person_id integer REFERENCES person(id),
  expiry_date date
);

CREATE TABLE car(
  owner_id integer REFERENCES person(id),
  registration_number TEXT
);
Run Code Online (Sandbox Code Playgroud)

这是查询:

SELECT person.name, person.id, license.expiry_date, COUNT(car) FROM person
  JOIN license ON license.person_id = person.id
  JOIN car ON car.owner_id = person.id
WHERE person.name = 'Charles Bannerman'
GROUP BY person.id;
Run Code Online (Sandbox Code Playgroud)

知道,因为我自己的业务逻辑,一个人只能有一个license,所以当我加入这个人的时候,即使是GROUP BY'd,我应该可以找到他们的license number。但是,因为它不是 GROUP BY 语句的一部分并且不使用聚合函数,所以我无法访问它。

我应该如何以惯用的方式编写此查询。我已经看到了关于 LATERAL JOIN、窗口函数和子查询的模糊内容,但我不确定回答这个问题的最佳方法。

小智 1

seharusnya seperti ini(应该是这样的):

SELECT person.name, person.id, license.expiry_date, COUNT(car) FROM person
  JOIN license ON license.person_id = person.id
  JOIN car ON car.owner_id = person.id
WHERE person.name = 'Charles Bannerman'
GROUP BY person.name, person.id, license.expiry_date, car.car;
Run Code Online (Sandbox Code Playgroud)