Если у меня есть следующие таблицы (например, с использованием PostgreSQL, но может быть любая другая реляционная база данных), где car
имеет два ключа (id
и vin
):
create table car (
id int primary key not null,
color varchar(10),
brand varchar(10),
vin char(17) unique not null
);
create table appraisal (
id int primary key not null,
recorded date not null,
car_id int references car (id),
car_vin char(17) references car (vin),
price int
);
Я могу успешно включить c.color
и c.brand
в список выбора без их агрегирования, поскольку они зависят от c.id
:
select
c.id, c.color, c.brand,
min(price) as min_appraisal,
max(price) as max_appraisal
from car c
left join appraisal a on a.car_id = c.id
group by c.id; -- c.color, c.brand are not needed here
Однако следующий запрос не выполняется, поскольку он не позвольте мне включить c.color
и c.brand
в список выбора, даже если это зависит от c.vin
(это ключ) таблицы.
select
c.vin, c.color, c.brand,
min(price) as min_appraisal,
max(price) as max_appraisal
from car c
left join appraisal a on a.car_vin = c.vin
group by c.vin; -- Why are c.color, c.brand needed here?
Ошибка: ERROR : столбец «c .color» должен появиться в предложении GROUP BY или использоваться в агрегатной функции. Позиция: 18
Пример в DB Fiddle .