Я искал вопросы по SQL Server, используя "INTERSECT" в качестве ключевого слова, и ничего не помогло - PullRequest
0 голосов
/ 18 мая 2018

У меня есть две таблицы в двух базах данных.Один находится в «первичной» базе данных, второй - в «архивной» базе данных.Структуры идентичны, только данные разные.Проблема в том, что в основной таблице есть записи, которые дублируются в архивной таблице.Мне нужно удалить дубликаты из первичной таблицы перед архивированием записей в архивную таблицу.Первая попытка, казалось, работала хорошо, но журнал активности заполнился, убивая процесс, потому что там просто слишком много происходило.Администраторы баз данных сказали мне, чтобы удалить кусками по 100000.

Я также обнаружил, что в записях могут быть различия, даже если первичные ключи совпадают между базами данных.Эти записи должны быть сохранены, а не удалены как дубликаты.Это привело меня к пунктам INTERSECT и EXCEPT.Я пробовал эти три примера, и хотя каждый INTERSECT возвращает 100 000 записей, команда DELETE удаляет только от 94 000 до 95 000 записей.Я включил несколько комментариев для каждого.Последний удаляет все из основной таблицы базы данных.

-- Test #1: Doesn't delete 100,000 - around 94,000 or 95,000
DELETE TOP (100000) FROM [db_1].[table_1]
WHERE EXISTS    (
                    -- Returns 100,000
                    SELECT * FROM [db_1].[table_1]
                    INTERSECT
                    SELECT * FROM [db_2].[table_1]
                )

-- Test #2: Doesn't delete 100,000 - around 94,000 or 95,000
--          [test_data] returns 100,000 records
;WITH [test_data] AS    (
                            -- Returns 100,000
                            SELECT TOP (100000) * 
                            FROM    (
                                        SELECT * FROM [db_1].[table_1]
                                        INTERSECT
                                        SELECT * FROM [db_2].[table_1]
                                    ) [meh]
                        )
DELETE TOP (100000) FROM [db_1].[table_1]
WHERE EXISTS    (
                    SELECT * FROM [test_data]
                )

-- Test #3: Deletes everything from [db_1].[table_1]
--          The EXISTS clause returns 100,000
--          The DELETE statement deletes everything from [db_1].[table_1]
DELETE FROM [db_1].[table_1]
WHERE EXISTS    (
                    SELECT TOP (100000) [meh].[address_rid]
                        ,[meh].[REV] 
                    FROM    (
                                -- Returns 100,000
                                SELECT * FROM [db_1].[table_1]
                                INTERSECT
                                SELECT * FROM [db_2].[table_1]
                            ) [meh]
                )

Достаточно ли этой информации или мне нужно добавить больше?Заранее спасибо ...

* РЕДАКТИРОВАТЬ * Дерьмо! Хорошо, я ценю отзывы и постараюсь быть более тщательным в моем объяснении.Мне нужно удалить записи, которые дублируются между двумя таблицами базы данных.С требованием проверить каждую запись, чтобы удостовериться, что она является истинной копией, никакие данные не были изменены в основной базе данных, я обнаружил INTERSECT.Я понимаю, что он выполняет сравнение между полями, проверяя, является ли запись истинным дубликатом между таблицами базы данных.Как только это будет установлено, я хочу удалить дублированную запись из базы данных primary , оставив другую запись в базе данных archive ...

Primary database:        Archive database:
table_1:                 table_1:
PK     f_1   f_2   f_3   PK   f_1   f_2   f_3
 1     A     B     B      1   A     B     B
 2     B     D     X      2   B     D     X
 3     C     G     Y     13   Q     M     O
 4     D     J     Z     14   S     M     K

В приведенных выше наборах таблиц дублирование выполняется с записями 1 и 2. Поскольку они обе существуют в обеих таблицах, мне нужно удалить их из основной таблицы базы данных.Я сталкиваюсь с тем, что в некоторых таблицах есть миллионы записей, и их необходимо удалить в 100 000 блоков записей, как это делают наши администраторы баз данных.Я думал, что если я добавлю INTERSECT в предложение EXISTS, ограничив результаты INTERSECT 100 000 записями, DELETE удалит этот 100 000 записей.Но это не так.Он удаляет, возможно, от 94 000 до 95 000 записей, затем, когда он приближается к концу удаления, он начинает удалять несколько тысяч за раз, сводя к концу несколько записей.

Если я использую его неправильно или если есть лучший способ удалить дублированные записи, я весь слух.Как отмечали некоторые из вас, мне трудно задавать вопросы правильно, поэтому я больше не задаю слишком много.Я ценю любые предложения, комментарии, советы и / или критику.Я не так горжусь, чтобы отказаться от любой помощи.Если это не словесная атака на мою собаку.Тогда я могу расстроиться!;-) Надеюсь, это поможет.Если нет, я уверен, что услышу об этом.

...