create table categories (
id int generated always as identity primary key,
name varchar
);
insert into categories(name) values ('Cat1'), ('Cat2');
create table items (
id int generated always as identity primary key,
name varchar
);
insert into items(name) values ('Item1'), ('Item2'), ('Item3');
create table item_categories (
item_id int references items(id),
category_id int references categories(id)
);
insert into item_categories values (1, 1), (2, 2), (3, 1), (3, 2);
select i.name
from items i
join item_categories ic on i.id = ic.item_id
join categories c on c.id = ic.category_id
group by i.id, i.name
having count(distinct c.id) = (select count(*) from categories);