Аналитические функции лучше для такой работы - они избегают всех объединений. Например:
select col1, col2, col3
from (
select t.*,
case when min(col3) over (partition by col2) !=
max(col3) over (partition by col2) then 0 end as flag
from tab t
)
where flag = 0;
Не совсем понятно, как вы хотите обработать null
в col3
- это считается «другим» значением? Что если у вас null
более одного раза (для одного и того же значения в col2
)? Кроме того - что если col2
может быть null
?