2016-11-11 1 views
1

Это один из запросов в моей хранимой процедуре, где я вставляю записи из таблицы Main для дублирования таблицы, после чего я хотел бы удалить дублировать строки в моей основной таблице более одного.Удалите повторяющиеся строки с одинаковыми значениями в таблице, но сохраняйте одну строку в SQL Server

Это мой код

IF EXISTS (SELECT * 
      FROM [JOB] 
      WHERE 
       AND ExternalSourceId = @ExternalSourceId 
       AND Id <> @Id 
       AND IsActive = 1) 
BEGIN 
    INSERT INTO DupJob 
     SELECT * 
     FROM [JOB] j 
     WHERE 
      AND ExternalSourceId = @ExternalSourceId 
      AND Id <> @Id 
      AND IsActive = 1 
      AND NOT EXISTS (SELECT * FROM DupJob dj WHERE J.Id = dj.Id)  
    -- the delete should delete all duplicates except one ? 
END  

Ищу помощь для продолжения, спасибо

+0

Какая у вас проблема? –

+0

Я просто хочу, чтобы продолжить работу с инструкцией delete – user1221765

ответ

1

row_number() и КТР удобный способ сделать это. Я не уверен, что именно логика вы хотите, но это что-то вроде этого:

with todelete as (
     select j.*, 
      row_number() over (partition by OrganizationName, JobTitle, PostalCode, ExternalSourceId) 
           order by id) as seqnum 
     from job j 
    ) 
delete from todelete 
    where seqnum > 1; 

Это будет держать одну строку для каждого столбцов в partition by, один с минимальным значением id.

+0

Я думал, что либо использовать row_number(), либо rank(). Могу ли я использовать то же самое в сочетании с моим запросом? pls предлагают – user1221765

+0

номер ранга и ряда немного отличаются в том, как они относятся к связям. Без связей они эквивалентны. –