SQL删除重复行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL删除重复行相关的知识,希望对你有一定的参考价值。

我一直在尝试使用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

任何帮助都会很棒!

答案

不要按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;
另一答案

在查询中使用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
另一答案

试试这个 -

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

以上是关于SQL删除重复行的主要内容,如果未能解决你的问题,请参考以下文章

sql数据库中出现重复行数据,如何删除这些重复记录?

删除sql查询中的重复行[重复]

SQL删除重复行

如何删除唯一行并保持重复? SQL

PL/SQl,oracle 9i,使用sql删除重复行

使用嵌套行(类型 STRUCT)对表 SQL 进行重复数据删除