SQL删除重复行

问题描述 投票:0回答:3

我一直在尝试使用HAVING count(*)> 1,group by,distinct和sub查询删除重复项,但无法使这些重复工作..

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

任何帮助都会很棒!

sql select duplicates
3个回答
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;

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

0
投票

试试这个 -

SELECT distinct UserID,  BuildingNo    
FROM  Staff INNER JOIN TblBuildings ON Staff.StaffID = 
TblBuildingsStaffID
© www.soinside.com 2019 - 2024. All rights reserved.