SQL SERVER 如何查找一个表里面的重复数据
标签(空格分隔): SQL
用法
不想深究原理的同学只要看这个部分就行了。
这个文章是对stackoverflow上的一个答案的解读:
stackoverflow原答案
首先对这个处理做一个简要分析:
选取temp1中重复的OrderNo数据.
所以, 如果你想要找一个customer表中的重复的UserID, 只要替换
temp1
为customer
, 把OrderNo
替换为UserID
就行了。
with x as (select *,rn = row_number()
over(PARTITION BY OrderNo order by OrderNo)
from temp1)
select * from x
where rn > 1
分析
我们下面来分析一下这个答案
- with x as …
我们可以看一下这个文章的分析:
什么是with
文章中说明:
You can think of it kind of like a temporary table that only lasts for one query and then goes away by itself.
所以我们可以理解, x
这里就是一个临时表
2 如何理解over
可以阅读这个文章:
the explain for the sql over
over PARTITION
是一个对select 结果分区的一个操作
You can use GROUP BY SalesOrderID. The difference is, with GROUP BY you can only have the aggregated values for the columns that are not included in GROUP BY.
当你使用over的时候, 那个返回的结果集里面可以包括非聚集函数或者非group by句子中的列, 而order by 是不能实现这个问题的。
- 那么我们整体来看这个问题就是
第一步: 从temp1表中选取所有数据和聚集函数的结果row_numer(), row_number() 按照OrderNo 分区, 按照OrderNo排序, 把选取的数据暂存到 x 中
第二步: 因为row_number() 是按照OrderNo计算和排序的, 所以, rn 实际上记录了, 每一个OrderNo的行数, 所以 如果rn > 1 说明这个OrderNo是有重复数据的.