Поиск дубликатов на основе нескольких столбцов - PullRequest
0 голосов
/ 11 июня 2019

Мне нужно найти все строки, которые являются дубликатами в разных местах. Данные таблицы, как показано ниже,

---------------------------------------------------------
| Assetno  |  SerialNo  |   StickerNo  |     location  |
---------------------------------------------------------
| 1234     |   QWR      |   12ERT      |     123       |
| 1234     |   QWR      |   12ERT      |     567       |
| 7888     |   ytu      |   67UI       |     456       |
| 9000     |   UIO      |   OPIO9      |     8         |
---------------------------------------------------------

Как и в приведенной выше таблице, мне нужно найти строки, такие как строки номер 1 и 2.

1 Ответ

3 голосов
/ 11 июня 2019

Один метод использует оконные функции. Итак, это работает с вашими примерами данных:

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...