Sql脚本查找类似的用户记录

时间:2015-01-02 17:51:31

标签: sql sql-server sql-server-2008

我的LawfirmUser表包含FirstNameLastNameuserId列 以下是LawfirmUser的一些样本数据

FirstName      LastName     userId
----------   -----------  ----------
Demo            test1         1
Demo            test1         2
Demo            test1         3
Demo            test2         4
Demo            test2         5
Demo            test3         6 
Demo            test4         7 

尝试编写脚本以查找具有相同名字和姓氏但不同userIds的所有记录

查询应返回以下数据

FirstName      LastName     userId
----------   -----------  ----------
Demo            test1         1
Demo            test1         2
Demo            test1         3
Demo            test2         4
Demo            test2         5

我是sql的初学者,有人可以帮我查询一下吗?

3 个答案:

答案 0 :(得分:3)

以下是它的工作原理

CTE1,CTE2等在Sql Server中称为公用表表达式,它们作为临时表,不会存储在内存中,并在执行查询后被清除。

1。 CTE1 - 从表格中选择不同的值。例如,如果表格具有相同的FirstNameLastNameUserId,我们应该避免这种情况,因为您需要找到相同FirstNameLastName的记录对于不同的UserId
2。 CTE2 - 从CTE1中选择结果,我们会为不同的FirstName计算相同的LastNameUserId 。下图将说明COUNT(*) OVER(PARTITION BY FirstName,LastName)

的用法

enter image description here

3。最后,我们会将结果显示在CNT>1

这是工作查询。

;WITH CTE1 AS
(
    SELECT DISTINCT * FROM YOURTABLE
)
,CTE2 AS
(
   SELECT *, COUNT(*) OVER(PARTITION BY FirstName,LastName) CNT
   FROM CTE1
)
SELECT FirstName,LastName,userId
FROM CTE2 
WHERE CNT>1

enter image description here

答案 1 :(得分:3)

使用Window Function

;WITH cte
     AS (SELECT *,
                Row_number()OVER(PARTITION BY FirstName, LastName ORDER BY userid) rn
         FROM   YOURTABLE)
SELECT *
FROM   cte a
WHERE  EXISTS (SELECT 1
               FROM   cte b
               WHERE  a.FirstName = b.FirstName
                      AND a.LastName = b.LastName
                      AND rn > 1) 

答案 2 :(得分:2)

自我加入会做到这一点。

SELECT A.FirstName, A.LastName, A.userID
FROM lawfirmuser A
INNER JOIN lawFirmuser B 
  on A.FirstName = B.FirstName
 and A.LastName = B.LastName
 and A.UserID <> B.UserID
GROUP BY A.FirstName, A.LastName, A.userID

然而,可能会有更优雅的方式。如果lawfirmuser中存在相同的first,last和userID,我不相信会受到影响。