我一直试图使用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
任何帮助都会很棒!
答案 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