2016-04-11 101 views
0

我有两个表:T-SQL查询来检查重复

位置

LocationID LocationName 
========================= 
1   Boston 
2   Milwaukee 
3   Denver 
4   Denver 
5   Cleveland 
6   Cleveland 

LocationOwner

LocationID AppSecurityUserID 
================================================ 
1   A713E156-FEAB-474C-A078-04C8022A387C 
2   AF6EEFCE-7F5D-4B3C-BE3D-085A4C85832E 
3   9964FAF7-8A2E-4BFE-9FE2-0B47E585FB9C 
3   6F410CB4-312C-440A-8669-2106C49517F1 
3   EC8CAD4A-4FB2-4BE1-97AC-28C8CF68CCE0 
5   7B55B6A2-F94D-4608-938A-4206FE1DAF6D 

位置表已被错误地填入重复的地点名称,但具有独特的位置ID。我需要加入地点LocationOwner表以检查用户是否不是这两个地点的所有者。例如,Denver的LocationOwner应绑定到LocationID of 3 4,但不是两者。基本上我需要检查没有用户绑定到多个重复的位置。我猜这有一个疑问,但我没有取得很大的进展。

回答

0

你只需要第一个表来检查重复

WITH CTE as 
(SELECT *, 
ROW_NUMBER() OVER(PARTITION BY LocationName ORDER BY LocationID) as rn 
FROM Locations) 
SELECT LocationID,LocationName FROM CTE WHERE rn=1 
0

加入对LocationID两个表,并查找复制User和LOCATIONNAME行。

这里已经有很多问题了,这些问题向您展示了如何在多列上找到重复项。

0

我想已经有一个关键的预防由LocationID重复...

select * from (
    select 
     o.AppSecurityUserID, 
     l.LocationName, 
     l.LocationID, 
     LocationDupedCount = count(*) over(partition by o.AppSecurityUserID, l.LocationName) 
    from 
     LocationOwner o 
     inner join Location l on l.LocationID = o.LocationId 
) t 
where 
    t.LocationDupedCount > 1 
0

您应该能够通过使用GROUP BY与具有寻找受骗者..

SELECT lo.AppSecurityUserID, 
     l.LocationName 
FROM LocationOwner lo 
     JOIN Locations l ON lo.LocationID = l.LocationID 
GROUP BY lo.AppSecurityUserID, 
     l.LocationName 
HAVING COUNT(LocationName) > 1