Есть ли способ удалить дубликат из таблицы в SQL Server?

#sql-server

#sql-server

Вопрос:

У меня есть такая таблица:

введите описание изображения здесь

Как вы можете видеть, строки 2 и 3 похожи, а строка 3 является бесполезным дубликатом. Мой вопрос в том, как мы можем удалить только строку 3, но сохранить row2 и row4 одновременно.

Вот так:

введите описание изображения здесь

Спасибо за вашу помощь!

Комментарии:

1. Что делать, если E2 заменяется на E3, какая строка тогда является «бесполезным дубликатом»? Определение «дубликата» должно быть очень формальным, поскольку некоторые значения представляют собой бизнес-ключ, некоторые — атрибуты, и, похоже, вы хотите сохранить строки, содержащие ненулевые данные, поверх других.

2. Есть ли здесь определение: «Если portCode столбцы , effectiveDate , и issueCOAName совпадают, то из этих строк сохраняются только записи с ненулевыми эталонными столбцами»?

3. «и строка 3 является бесполезным дубликатом». тем не менее, значения в последних 2 столбцах отличаются, поэтому он по определению не является дубликатом. То, что определяет, что верхняя строка должна быть удалена, а не нижняя?

4. Кстати, Кенни, твое настоящее имя отображается в правом верхнем углу этих скриншотов; если тебе не все равно (я предполагаю, что ты мог бы, из-за использования псевдонима здесь).

5. @JNevil Ты прав

Ответ №1:

У вас нет дубликатов. Если бы у вас была таблица кучи с идентичными записями, то каждое значение в одной или нескольких записях было бы одинаковым. Одним из способов решения этой проблемы было бы добавление столбца идентификатора. Затем столбец identity можно использовать для удаления некоторых, но не всех дубликатов.

В вашем случае вы хотите удалить записи, если существует другая запись, которая похожа и, возможно, содержит «лучшие» данные. Для этого можно использовать предложение EXISTS . Приведенная ниже логика — это не то, что вам нужно, но она должна дать вам представление о том, как с этим справиться.

 DELETE t
FROM MyTable t
WHERE t.BCT IS NULL -- delete only records with no values?  
    AND t.BCS IS NULL 
    AND EXISTS( -- another record with a value exists, so this one might not be needed?
        SELECT * 
        FROM MyTable x
        WHERE (x.BCT IS NOT NULL OR t.BCS IS NOT NULL)
            AND x.portCode = t.portCode 
            AND x.effDate = t.effDate
            AND LEFT(x.issueName, 26) = LEFT(t.issueName, 26)
        )