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删除重复行的主要内容,如果未能解决你的问题,请参考以下文章