SQL删除重复行

时间:2018-03-06 09:51:08

标签: sql select duplicates

我一直试图使用HAVING count(*)>删除重复项。 1,分组依据,不同分子查询和子查询,但无法使其中的任何一个工作..

SELECT UserID,  BuildingNo    
FROM  Staff INNER JOIN TblBuildings ON Staff.StaffID = 
TblBuildingsStaffID
GROUP BY TblStaff.User_Code, BuildingNo

我得到的是......

StaffID1 | BuildingNo1
StaffID1 | BuildingNo2
StaffID2 | BuildingNo2
StaffID3 | BuildingNo1
StaffID3 | BuildingNo2

我试图得到它所以它只显示有一个建筑物编号的工作人员(如果他们有两个,无论它显示哪个),如:

StaffID1 | BuildingNo1
StaffID2 | BuildingNo2
StaffID3 | BuildingNo1

它可能太难了。我已经尝试过将CTE左侧加入建筑物到工作人员表中,当我尝试这个时,这些因为某些原因而变为NULL

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:2)

不要按BuildingNo分组,然后您可以使用having过滤掉您想要的群组。

SELECT s.UserID, min(b.BuildingNo) as buildingno
FROM Staff s
   JOIN TblBuildings ON s.StaffID = b.TblBuildingsStaffID
GROUP BY s.UserID
having count(distinct b.BuildingNo) = 1;

min()聚合是必需的,因为buildingno不是group by子句的一部分。但由于having()子句仅返回具有一个建筑物的子句,因此它不会改变任何东西。

如果要显示所有工作人员,只需选择一个(任意)建筑物,则只需忽略having条件。

如果您想要包含的工作人员而不建筑物,则需要左连接:

SELECT s.UserID, min(b.BuildingNo) as buildingno
FROM Staff s
   LEFT JOIN TblBuildings b ON s.StaffID = t.TblBuildingsStaffID
GROUP BY t.UserID;

答案 1 :(得分:0)

在查询中使用row partition关键字以避免重复

   WITH CTE AS( SELECT   ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY UserID )  AS 'Num',UserID,  BuildingNo    
    FROM  Staff INNER JOIN TblBuildings ON Staff.StaffID = 
    TblBuildingsStaffID
    GROUP BY TblStaff.User_Code, BuildingNo)
SELECT * FROM CTE
WHERE Num =1

答案 2 :(得分:0)

试试这个 -

SELECT distinct UserID,  BuildingNo    
FROM  Staff INNER JOIN TblBuildings ON Staff.StaffID = 
TblBuildingsStaffID