Как я могу удалить дубликаты из этой таблицы сервера Sql? - PullRequest
1 голос
/ 09 ноября 2010

У меня есть одна таблица в БД Sql Server 2008 r2. Каждые несколько секунд я импортирую данные в эту таблицу. В какой-то момент импорт не удался, поэтому он постоянно импортировал одни и те же данные, создавая дубликаты. (в основном, если импорт прочитал 20 строк, импортировал 19 и потерпел неудачу 20 .. тогда эти 19 не были в транзакции .. и, таким образом, были вставлены).

В любом случае, я пытаюсь выяснить, как я могу удалить все дубликаты и только первую (оригинальную) вставленную строку?

Вот схема таблицы - и обратите внимание, что есть несколько полей, которые можно обнулять.

CREATE TABLE [dbo].[LogEntries](
    [LogEntryId] [int] IDENTITY(1,1) NOT NULL,
    [GameFileId] [int] NOT NULL,
    [CreatedOn] [datetimeoffset](7) NOT NULL,
    [EventTypeId] [tinyint] NOT NULL,
    [Message] [nvarchar](max) NULL,
    [Code] [int] NULL,
    [Violation] [nvarchar](100) NULL,
    [ClientName] [nvarchar](100) NULL,
    [ClientGuid] [nvarchar](50) NULL,
    [ClientGuidReversed] [nvarchar](50) NULL,
    [ClientIpAndPort] [nvarchar](50) NULL,
 CONSTRAINT [PK_LogEntries] PRIMARY KEY CLUSTERED 
(
    [LogEntryId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Приветствия:)

ОБНОВЛЕНИЕ: Что такое Дубликаты (в данном случае?)

Черт, извините. забыл определить дубликат. LogEntryId уникален, поэтому игнорируйте эту часть информации (она не импортируется). все остальные данные импортируются. Вот две строки данных, которые идентичны.

6459749 39  2010-11-05 00:00:25.0000000 +11:00  6   Violation (MULTIHACK) #70805    70805   MULTIHACK   angelb  aeda202c22ed41f7301d0673647c55d8    8d55c7463760d1037f14de22c202adea    220.246.157.194:57133
6459766 39  2010-11-05 00:00:25.0000000 +11:00  6   Violation (MULTIHACK) #70805    70805   MULTIHACK   angelb  aeda202c22ed41f7301d0673647c55d8    8d55c7463760d1037f14de22c202adea    220.246.157.194:57133

и сравнить это с топ-5, упорядоченным по desc

6505931 40  2010-11-08 23:39:16.0000000 +11:00  4   NULL    NULL    NULL    Zaphrolio   69ae1bfea616c244e5c223e51d5ceb8e    e8bec5d15e322c5e442c616aefb1ea96    175.38.209.80:10000
6505930 39  2010-11-08 23:39:04.0000000 +11:00  3   NULL    NULL    NULL    imBakedAsBro    8cf1b3b6a389229fa4adeec07dc087ce    ec780cd70ceeda4af922983a6b3b1fc8    110.175.83.45:10000
6505929 39  2010-11-08 23:39:03.0000000 +11:00  2   NULL    NULL    NULL    imBakedAsBro    NULL    NULL    110.175.83.45:10000
6505928 80  2010-11-08 23:39:04.0000000 +11:00  4   NULL    NULL    NULL    Asmo74  5ccf5ee85a6cf08da563bdcbfe75351d    d15357efbcdb365ad80fc6a58ee5fcc5    61.68.212.231:50273
6505927 80  2010-11-08 23:39:03.0000000 +11:00  4   NULL    NULL    NULL    McJellyfish c48218542918bec900a331a81e0a9d05    50d9a0e18a133a009ceb81924581284c    60.225.3.2:10000

Ответы [ 2 ]

5 голосов
/ 09 ноября 2010
with cte as (
 select row_number() over (
   partition by  
      [GameFileId]
    , [CreatedOn]
    , [EventTypeId]
    , [Message]
    , [Code]
    , [Violation]
    , [ClientName]
    , [ClientGuid]
    , [ClientGuidReversed]
    , [ClientIpAndPort]
 order by [LogEntryId]) as rn
 from LogEntries)
delete from cte
 where rn > 1;
0 голосов
/ 09 ноября 2010

в отсутствие какой-либо другой информации UNION ALL обычно является хорошим трюком для того, чтобы выбрасывать дубликаты

select * from table
union 
select * from table

Отредактировано для отражения опечатки в комментарии ...

...