根据多列查找重复项

时间:2019-06-10 21:24:21

标签: sql sql-server

我需要找到在不同位置重复的所有行。 表格数据如下,

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

就像上表一样,我需要找到第1行和第2行之类的行。

1 个答案:

答案 0 :(得分:3)

一种方法使用窗口函数。因此,这适用于您的示例数据:

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)上使用索引也可能会更快。