Your request from the view will not work if you put PK on public.t_place_type .
This will result in this error:
ERROR: column "pt.c_name" must appear in the GROUP BY clause or be used in an aggregate function LINE 3: pt.c_name AS c_place_type ^
This is because, from your documentation link, A functional dependency exists if the grouped columns (or a subset thereof) are the primary key of the table containing the ungrouped column .
Postgres knows that PK is a unique row, so as soon as you group it, you can group all the columns from this table and get the same result.
Those give the same result: with ungrouped strings:
SELECT * FROM public.t_place; SELECT * FROM public.t_place GROUP BY id; SELECT * FROM public.t_place GROUP BY id, c_name; SELECT * FROM public.t_place GROUP BY id, c_name, id_place_type; SELECT * FROM public.t_place GROUP BY id, id_place_type;
And you use this dependency when choosing pt.c_name AS c_place_type , because you grouped this table with the primary key pt.id , with a nonexistent PC after deleting it, so grouping by it makes pt.c_name , which are not used together and are not used in group by . That's why Postgres complains about viewing dependency - its request will no longer work as soon as you drop this PC.
You can try it yourself with a modified example from your question:
CREATE TABLE public.t_place_type ( id serial NOT NULL, c_name character varying(100) ); CREATE TABLE public.t_place ( id serial NOT NULL, c_name character varying(50), id_place_type integer, CONSTRAINT pk_t_place PRIMARY KEY (id) ); SELECT p.id, p.c_name, pt.c_name AS c_place_type FROM t_place p LEFT JOIN t_place_type pt ON pt.id = p.id_place_type GROUP BY p.id, pt.id, p.c_name;