2014-02-10 65 views
1

你好,我已經做了下面的下面的查詢:SQL服務器重複記錄

UPDATE [dbo].[TestData] 
SET Duplicate = 'Duplicate within' 
WHERE exists 
(SELECT telephone, COUNT(telephone) 
FROM [dbo].[TestData] 
GROUP BY telephone 
HAVING (COUNT (telephone)>1)) 

在該表中居然有9個重複的電話記錄。

該查詢將整個重複列標記爲'重複內'而不是9個記錄。

下屆查詢我還開發了將unstamp 18個重複記錄到9

UPDATE [dbo].[TestData] 
SET Duplicate = 'NO' 
WHERE ID IN (SELECT MIN(ID) FROM [dbo].[TestData] GROUP BY telephone) 

這查詢不工作既不能請人指導我在哪裏,我錯了!

+1

你想做什麼? – Rodion

回答

2

問題是沒有篩選EXISTS查詢。它需要每個電話號碼進行過濾:

UPDATE [dbo].[TestData] 
SET Duplicate = 'Duplicate within' 
FROM [TestData] t 
WHERE EXISTS (
    SELECT telephone, COUNT(telephone) 
    FROM [dbo].[TestData] 
    WHERE telephone = t.telephone 
    GROUP BY telephone 
    HAVING (COUNT (telephone)>1)) 
) 
+0

@ Ap9_Jacka,以及你發佈的SQL不是我提供的SQL - 你發佈了(在你的評論中)你發佈在你的問題中的SQL。這並不奇怪,不起作用。 –

+0

對不起,非常感謝你的類型錯誤!下一個查詢是否會以完整的工作格式來解除18到9的取整? –

+0

@ Ap9_Jacka,只要你遵循相同的模式,它會正常工作。你必須添加'FROM'和過濾(到'EXISTS'查詢)。 –

3

你可以做到這一點使用其中存在的,但它更容易讀/寫這樣一來,性能差異很可能是最小的。

update TestData set 
    Duplicate = 'Duplicate within' 
where 
    Telephone in (
     select Telephone 
     from TestData 
     group by Telephone 
     having count(*) > 1 
    ) 

離開單獨各電話號碼的第一個記錄並標記只能用同一個電話號碼隨後的記錄,使用一個CTE如下:

;with NumberedDupes as (
    select 
     Telephone, 
     Duplicate, 
     row_number() over (partition by Telephone order by Telephone) seq 
    from TestData 
) 
update NumberedDupes set Duplicate = 'Duplicate within' where seq > 1 
+0

如果我想只是不加複製的重複項,那麼18我怎麼才能不恢復到9? –

+0

不確定你的意思是「unstamp」。你想刪除重複記錄嗎?或者你想只標記其中每一個爲重複的? –

+0

我想只標記每個重複的一個,因爲上面的查詢標記爲18以上。我想標記爲9. –

0

如果你只是想找到重複,您需要查看以下子選項所展示的兩條記錄中的一條。 EXISTS實際上會讓你更新兩行,因爲這就是你正在測試的內容。

UPDATE [dbo].[TestData] 
    SET Duplicate = 'Duplicate within' 
    WHERE Id IN 
    (SELECT MAX(Id) 
    FROM [dbo].[TestData] 
    GROUP BY telephone 
    HAVING (COUNT (telephone)>1)) 
+0

如果我想只是不需要複製重複項,那麼我該如何將它重新設置爲9? –

+0

我的查詢應該只更新9個重複行,使用插入的最後一個id作爲副本。 –

+0

非常感謝!所以前兩行是更新和設置。 Max(Id)位在做什麼?我想了解以及:)我是新來的SQL –