查找具有相同值的行并进一步过滤结果

时间:2017-08-13 07:59:35

标签: sql

给出以下表格和数据

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作为条件来过滤结果集。

3 个答案:

答案 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;