Как насчет использования оконной функции для ранжирования строк:
create view v as
select * from (values ('att1_001', 'att2_001', 1),
('att1_002', 'att2_001', 2),
('att1_003', 'att2_001', 3),
('att1_004', 'att2_002', 10),
('att1_005', 'att2_002', 11)) as foo(a1, a2, a3);
select * from v;
a1 | a2 | a3
----------+----------+----
att1_001 | att2_001 | 1
att1_002 | att2_001 | 2
att1_003 | att2_001 | 3
att1_004 | att2_002 | 10
att1_005 | att2_002 | 11
(5 rows)
select a1, a2, a3
from ( select a1, a2, a3, row_number() over (partition by a2 order by a3) as ord
from v ) z
where ord=1;
a1 | a2 | a3
----------+----------+----
att1_001 | att2_001 | 1
att1_004 | att2_002 | 10
(2 rows)
Обратите внимание, что какой бы подход вы ни использовали, вам нужно учитывать, какие результаты вы хотите получить, когда есть связь.Этот подход будет выбирать произвольно между связанными рядами - ваш расширит результаты.