Используйте NOT EXISTS
:
select t.*
from tablename t
where t.type = 'A'
or not exists (select 1 from tablename where id = t.id and name = t.name and type = 'A')
Если name
не должно быть включено в условие, используйте следующее:
or not exists (select 1 from tablename where id = t.id and type = 'A')
Или используйте RANK()
оконную функцию :
select t.id, t.name, t.type
from (
select t.*
rank() over (partition by id, name order by case when type = 'A' then 1 else 2 end) rnk
from tablename
) t
where t.rnk = 1
Или удалите name
из partition
, если это не актуально.