Я пытаюсь улучшить / оптимизировать мой запрос для проверки дубликатов в моей таблице TABLE1. Основное требование состоит в том, чтобы рассматривать нулевое значение как подстановочный знак.
Итак, с учетом приведенной ниже таблицы:
Рассматривая пустые поля как подстановочный знак, где, например, 'A' = null, имеет значение true. Ожидаемый результат - детали записи каждой записи в группе, а также с идентификатором группы, который является id и id1 в самой правой части таблицы:
Что уже достигнуто с помощью этого запроса:
WITH CTE
AS (SELECT t1.id, t2.id as id1 FROM TABLE1 t1
INNER JOIN TABLE1 t2
ON (t1.column1 = t2.column1 OR (t1.column1 IS NULL OR t2.column1 IS NULL))
AND (t1.column2 = t2.column2 OR (t1.column2 IS NULL OR t2.column2 IS NULL))
AND (t1.column3 = t2.column3 OR (t1.column3 IS NULL OR t2.column3 IS NULL))
AND (t1.column4 = t2.column4 OR (t1.column4 IS NULL OR t2.column4 IS NULL))
AND (t1.column5 = t2.column5 OR (t1.column5 IS NULL OR t2.column5 IS NULL))
AND (t1.column6 = t2.column6 OR (t1.column6 IS NULL OR t2.column6 IS NULL))
WHERE t2.id > t1.id)
SELECT *
FROM TABLE1 t1
INNER JOIN CTE C
ON t1.id = c.id
OR t1.id = c.id1
Я также использую индекс, содержащий Id, column1, column2, column3, column4, column5 и column6. Для небольшой таблицы запрос выполняется нормально, но когда я запускаю его с миллионами данных, он выполняется вечно.
Я пытался использовать соединения и isnull, но, похоже, это не имело значения.