给出以下表格和数据
Create Table Employees(
Employee_ID INT,
PhoneNumber VARCHAR(50)
);
INSERT INTO Employees VALUES (1,'111'),(2,'111'),(3,'123'),(4, '123'), (5, '124'), (6, '124')
我想为身份1的员工返回重复的电话号码。 我可以使用以下查询获取每位员工的所有重复电话号码
SELECT *
FROM Employees
WHERE PhoneNumber IN (
SELECT PhoneNumber
FROM Employees
GROUP BY PhoneNumber
HAVING COUNT(Employee_ID) > 1
)
但我希望使用员工ID作为条件来过滤结果集。
答案 0 :(得分:0)
非常简单,在您的情况下,表模式没有主/唯一键。所以,Rank是最好的解决方案。请在以下查询中提供@EmployeeId
的值。
WITH
CTE
AS
(
SELECT *, ROW_NUMBER()
OVER(PARTITION BY PhoneNumber
ORDER BY PhoneNumber ASC) AS RN
FROM Employees
WHERE Employee_ID = @EmployeeId
)
SELECT Employee_ID, PhoneNumber FROM CTE
WHERE RN > 1;
有关详细信息,请参阅此博客Possible ways to remove Duplicate Records in a Database Table – SQL Server
答案 1 :(得分:0)
你是说这个吗?
SELECT *
FROM Employees
JOIN Employees as Emp2 on Employees.PhoneNumber = Emp2.PhoneNumber
and Emp2.Employee_ID = @SearchForThis
或
SELECT *
FROM Employees
WHERE PhoneNumber IN (
SELECT PhoneNumber
FROM Employees
WHERE Employee_ID = @SearchForThis
)
如果员工拥有与您提供的员工ID相同的电话号码的员工,则可以获得所有员工信息。
答案 2 :(得分:0)
对查询的简单修改就足够了:
SELECT e.*
FROM Employees e
WHERE e.PhoneNumber IN (SELECT e2.PhoneNumber
FROM Employees e2
GROUP BY e2.PhoneNumber
HAVING COUNT(e2.Employee_ID) > 1
) AND
e.Employee_ID = 1;
但是,编写查询的更好方法是:
SELECT e.*
FROM Employees e
WHERE EXISTS (SELECT 1
FROM Employees e2
WHERE e2.PhoneNumber = e.PhoneNumber AND
e2.EmployeeId <> e.EmployeeId
) AND
e.EmployeeId = 1;