2017-08-13 91 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;