2014-02-10 4 views
1

Здравствуйте, я сделал следующий запрос ниже:SQL Server Дублирование записей

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 
    ) 

Чтобы оставить первую запись с только каждым номером телефона и отметьте только последующие записи с одинаковым номером телефона, используйте КТР следующим образом:

;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

Если бы я хотел просто разблокировать дубликаты, так как есть 18, как мне просто отстегнуть назад до 9? –

+0

Мой запрос должен обновлять только 9 повторяющихся строк, используя последний идентификатор, вставленный как дубликат. –

+0

Спасибо вам большое! поэтому первые две строки обновляются и устанавливаются. Что такое бит Max (Id)? Я также пытаюсь понять :) Я новичок в SQL –

Смежные вопросы