Я работаю с таблицей, которая является выпиской из набора других таблиц. Все строки таблицы извлечения должны быть уникальными в соответствии с ключами D1, D2 и D3. Они не. Похоже, что более ранний разработчик попытался решить эту проблему, используя SELECT DISTINCT
для всех столбцов, запрашиваемых из этой таблицы. Это будет работать, но только если каждая строка, которая является дубликатом (D1, D2, D3), также является дубликатом по не-ключевым столбцам (игнорируя столбец IDENTITY, который был добавлен в таблицу извлечения).
Другими словами, следующие строки:
D1 D2 D3 C4 C5 C6
=== === === === === ===
A B C X1 X2 X3
A B C X1 X2 X3
затем
SELECT DISTINCT D1, D2, D3, C4, C5, C6
FROM BAD_TABLE
будет работать, поскольку нет никакой разницы между строками, которые дублируются (D1, D2, D3). Но если таблица содержала
D1 D2 D3 C4 C5 C6
=== === === === === ===
A B C X1 X2 X3
A B C X1 X2 X4
тогда SELECT DISTINCT вернет две строки для ключа (A, B, C). Кроме того, нам нужно будет решить, какой из X3 или X4 является "правильным" значением.
Я знаю, как найти дубликаты (D1, D2, D3). Я даже знаю, как найти дубликаты во всех столбцах (кроме столбца IDENTITY):
;
WITH DUPLICATES(D1,D2,D3) AS
(
SELECT D1, D2, D3
FROM SOURCE
GROUP BY D1, D2, D3
HAVING COUNT(*)>1
)
SELECT S.D1, S.D2, S.D3, S.C4, S.C5, S.C6
FROM SOURCE S
INNER JOIN DUPLICATES D
ON S.D1 = D.D1 AND S.D2 = D.D2 AND S.D3 = D.D3
ORDER BY S.D1, S.D2, S.D3, S.C4, S.C5, S.C6
Вопрос в том, как найти подмножество вышеупомянутого набора результатов, которые дублируются на (D1, D2, D3), но не дублирует (D1, D2, D3, C4, C5, С6)?