用于检查重复项的T-SQL查询

时间:2016-04-11 19:38:30

标签: sql-server tsql

我有两张桌子:

地点

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

地理位置表格错误地填充了重复的地理位置名称,但具有唯一的 LocationID 。我需要使用 LocationOwner 表加入位置表,以检查用户是否不是这两个位置的所有者。例如,丹佛的 LocationOwner 应与3 OR 4的 LocationID 绑定,但不能同时绑定。基本上我需要检查没有用户绑定到多个重复位置。我猜这是一个问题,但我没有取得多大进展。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在LocationID上加入两个表,并查找与User和LocationName重复的行。

此处已有大量问题向您展示如何在多个列上查找重复项。

答案 2 :(得分: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

答案 3 :(得分:0)

你应该能够通过GROUP BY with HAVING找到欺骗..

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