Иногда полезно упростить задачу для оптимизатора запросов, разбив рабочую нагрузку на несколько этапов.Особенно, если выполнение может занять несколько часов:
-- Step 1
SELECT FIELD_1, FIELD_2, FIELD_3 INTO #Step1 FROM
(
SELECT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE WHERE XXX
UNION
SELECT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE WHERE YYY
) d
-- Step 2:
SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE
EXCEPT
SELECT FIELD_1, FIELD_2, FIELD_3 FROM #Step1
Обратите внимание, что некоторые пункты DISTINCT удалены
Обновление, версия 3. На основе последнего обновленияOP:
Tab: это та же самая таблица.Первый запрос в основном дает почти всю таблицу, а второй + третий запрос - это подмножества, которые мне нужно извлечь из результатов первого запроса
Я считаю, что весь запрос можно переписать так:
SELECT DISTINCT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE ext
WHERE NOT EXISTS (
SELECT * FROM (
SELECT FIELD_1, FIELD_2, FIELD_3 FROM MYTABLE
WHERE ( (XXX) OR (YYY)) -- original filter
) list
WHERE
list.FIELD_1 = ext.FIELD_1
AND list.FIELD_2 = ext.FIELD_2
AND list.FIELD_3 = ext.FIELD_3
)