Я работаю над проблемой в SQL Server 2008
У меня есть таблица с шестью столбцами:
PK INT
dOne SmallINT
dTwo SmallINT
dThree SmallINT
dFour SmallINT
dFiveSmallINT
dSix SmallINT
Таблица содержит около миллиона записей.Вероятно, стоит отметить это значение в столбце n + 1> значение в столбце n, то есть 97, 98, 99, 120, 135. Я пытаюсь удалить все строки, которые имеют 5 общих цифр (игнорируя PK), то есть:
76, 89, 99, 102, 155, 122
11, 89, 99, 102, 155, 122
89, 99, 102, 155, 122, 130
В этом случае алгоритм должен начинаться с первой строки и удалять вторые и третьи строки, поскольку они содержат 5 совпадающих цифр.Первая строка сохраняется.
Я пытался перебрать решение, но поиск всех дубликатов только для первой записи занимает более 25 секунд, что означает, что обработка всей таблицы займет ... слишком много времени (это должнобыть повторяемым процессом).
Я довольно плохо знаком с SQL, но это то, что я придумал (я придумал несколько решений, но ни одно из них не было адекватным ... это последняя попытка):
(я не буду включать весь код, но я объясню метод, я могу вставить больше, если это поможет)
Сохранить цифры записи n в переменных.ВЫБЕРИТЕ все записи, у которых есть одна общая цифра с записью ИЗ большой таблицы.
Вставьте все выбранные цифры в #oneMatch и включите [MatchOne] с совпадающей цифрой.
Выберите все записи, которые имеют одну общую цифру с записью n ИЗ таблицы временных значений, ГДЕ 'цифра вобщие '! = [соответствие].ВСТАВЬТЕ все выбранные цифры в #twoMatch и включите [MatchOne] И [MatchTwo] ...
Повторяйте до вставки в #fiveMatch.Удалите #fiveMatch из largeTable и перейдите к записи n + 1
У меня проблема с реализацией этого решения.Как я могу назначить соответствующую переменную в зависимости от предложения WHERE?
-- SELECT all records with ONE matching field:
INSERT INTO #oneMatch (ID_pk, dOne, dTwo, dThree, dFour, dFive, dSix, mOne)
SELECT ID_pk, dOne, dTwo, dThree, dFour, dFive, dSix
FROM dbo.BaseCombinationsExtended
WHERE ( [dOne] IN (@dOne, @dTwo, @dThree, @dFour, @dFive, @dSix) **mOne = dOne?
OR [dTwo] IN (@dOne, @dTwo, @dThree, @dFour, @dFive, @dSix) **mOne = dTwo?
OR [dTwo] IN (@dOne, @dTwo, @dThree, @dFour, @dFive, @dSix) **mOne = dThree?
...
OR [dSix] IN (@dOne, @dTwo, @dThree, @dFour, @dFive, @dSix) **mOne = dSix?
)
Я могу «подделать» вышеуказанное, используя шесть запросов, но это слишком неэффективно ...
Извините задлинное описание.Любая помощь будет принята с благодарностью (новое решение или реализация моей попытки выше), так как эта проблема мучила меня некоторое время ...