两个相同的查询找到重复的记录返回不同的结果

时间:2018-11-04 10:34:52

标签: sql-server tsql

我有两个查询,两个查询找到重复的记录,但是它们在同一张表上返回不同的结果

查询1返回17行

SELECT minimumexperience FROM minimumexperience GROUP BY minimumexperience HAVING COUNT(minimumexperience) > 1

查询2返回22行

 SELECT b.id
FROM
(
    SELECT id, 
           minimumexperience, 
           ROW_NUMBER() OVER(PARTITION BY lower(Trim(minimumexperience))
           ORDER BY minimumexperience) AS counts
    FROM minimumexperience --ORDER BY dbo.minimumexperience.minimumexperience ASC   
) AS b
WHERE b.counts > 1

1 个答案:

答案 0 :(得分:2)

一种解释是,如果给定的minimumexperience值可能出现两次以上,例如两次以上。 3或4次,那么您的第二个查询将返回第一个查询之外的 all 个重复项。例如,如果有四个记录,其特定值为minimumexperience

minimumexperience | ROW_NUMBER
10                | 1
10                | 2
10                | 3
10                | 4

然后,第一个查询将报告一个重复项,而第二个查询将报告三个重复项,因为三个记录的行号都大于一个。

另一种解释是,您在第二个查询中对LOWERTRIM的调用将minimumexperience的几个先前不同的值存储在一起,然后产生类似于上面的内容。也就是说,请考虑以下三个值:

minimumexperience | ROW_NUMBER
One               | 1
one               | 2
ONE               | 3

在第一个查询中,以上三个记录都是唯一的,但是在第二个查询中,所有三个记录都被映射到one,因此将生成两个重复项。

如果您真的想使用解析函数来执行此操作,因为您想查找所有重复的记录,那么COUNT会更合适:

SELECT b.id
FROM
(
    SELECT id, minimumexperience, 
       COUNT(*) OVER (PARTITION BY minimumexperience) cnt
    FROM minimumexperience
) AS b
WHERE b.counts > 1;
相关问题