#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)
)