Один метод использует оконные функции. Итак, это работает с вашими примерами данных:
select t.*
from (select t.*,
count(*) over (partition by Assetno, SerialNo, StickerNo) as cnt
from t
) t
where cnt >= 2;
Я бы более склонен использовать exists
, но:
select t.*
from t
where exists (select 1
from t t2
where t2.Assetno = t.Assetno and
t2.SerialNo = t.SerialNo and
t2.StickerNo = t.StickerNo and
t2.location <> t.location
);
Это более явно указывает, что строки с одинаковыми первыми тремя столбцами имеют разные местоположения. Вероятно, быстрее с индексом на (Assetno, SerialNo, StickerNo, location)
.