SQL删除重复行

SQL删除重复行,sql,select,duplicates,Sql,Select,Duplicates,我一直在尝试使用have count(*)>1、groupby、distinct和sub查询删除重复项,但这些查询都无法正常工作 SELECT UserID, BuildingNo FROM Staff INNER JOIN TblBuildings ON Staff.StaffID = TblBuildingsStaffID GROUP BY TblStaff.User_Code, BuildingNo 我得到的是 StaffID1 | BuildingNo1 StaffID1

我一直在尝试使用have count(*)>1、groupby、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
我正在尝试获取它,因此它只显示带有一个建筑编号的员工(如果他们有两个建筑编号,无论显示的是哪一个),如:

这不会太难。。我试过CTE的左键将大楼连接到staff表,当我试着这样做的时候,由于某种原因,这些都是空的


任何帮助都会很好

在查询中使用行分区关键字以避免重复

   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

在查询中使用行分区关键字以避免重复

   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

不要按
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;
由于
buildingno
不是group by子句的一部分,因此需要使用
min()
聚合。但是由于
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;

不要按
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;
由于
buildingno
不是group by子句的一部分,因此需要使用
min()
聚合。但是由于
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;
试试这个-

SELECT distinct UserID,  BuildingNo    
FROM  Staff INNER JOIN TblBuildings ON Staff.StaffID = 
TblBuildingsStaffID
试试这个-

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

提示:
MIN(BuildingNo)
groupby
ClauseUnrelated中删除
BuildingNo
,但是:提示:
MIN(BuildingNo)
groupby
ClauseUnrelated中删除
,它不会从名单上删除staffid1和staffid3吗?他们的计数(不同的构建编号)为2。@GerardH.Pille:谢谢,更正了代码(从问题中复制粘贴)。看来我看错了“*所以它只显示有一个楼号的员工*”是的,他的意思是“有一个楼号的员工”。如果这可以运行(因为没有“TblStaff.User_代码”),它不会从列表中删除staffid1和staffid3吗?他们的计数(不同的构建编号)为2。@GerardH.Pille:谢谢,更正了代码(从问题中复制粘贴)。看来我看错了“*所以它只显示了一个楼号的员工*”是的,他的意思是“有一栋楼的员工”。太夸张了。正如“按用户ID划分,按用户ID排序”。在一个只包含一个UserID的分区中,按UserID排序有什么用呢。正如“按用户ID划分,按用户ID排序”。在一个只包含一个UserID的分区内按UserID排序有什么用?虽然您的代码片段可能会解决这个问题,但您应该描述代码的用途(它如何解决问题)。此外,您可能希望检查,尽管您的代码片段可能会解决问题,但您应该描述代码的用途(它如何解决问题)。此外,您可能需要检查