2017-08-13 86 views
0

鉴于下表和数据查找行有相同的价值观,并进一步筛选结果

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') 

我想与ID 1 我能够得到所有的复制手机的员工返回复制电话号码每个员工使用以下查询号码

SELECT * 
FROM Employees 
WHERE PhoneNumber IN (
    SELECT PhoneNumber 
    FROM Employees 
    GROUP BY PhoneNumber 
    HAVING COUNT(Employee_ID) > 1 
    ) 

但我想过滤使用员工id作为条件的结果集。

+0

的数据库管理系统,您使用的 – kellymandem

+0

你的意思是你想使用员工ID作为标准?你是否想要提供一个员工ID并获得电话号码与员工的电话号码相匹配的员工? – AgapwIesu

回答

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您提供的电话号码,员工的员工信息。

+0

您能确认这两个查询是否返回了正确的重复记录集? – 2017-08-13 08:22:48

+0

@Mastero,这是对我的问题吗?是的,我测试了这些查询 - 它们都按预期工作。 – kouros

+0

@ kouros。 。 。在这种情况下,你期望的和你在问题中描述的是两个不同的东西。 –

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

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;