我的LawfirmUser表包含FirstName
,LastName
和userId
列
以下是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的初学者,有人可以帮我查询一下吗?
答案 0 :(得分:3)
以下是它的工作原理
CTE1,CTE2等在Sql Server中称为公用表表达式,它们作为临时表,不会存储在内存中,并在执行查询后被清除。
1。 CTE1 - 从表格中选择不同的值。例如,如果表格具有相同的FirstName
,LastName
和UserId
,我们应该避免这种情况,因为您需要找到相同FirstName
和LastName
的记录对于不同的UserId
。
2。 CTE2 - 从CTE1
中选择结果,我们会为不同的FirstName
计算相同的LastName
和UserId
。下图将说明COUNT(*) OVER(PARTITION BY FirstName,LastName)
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
答案 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,我不相信会受到影响。