Как часто вы собираетесь запускать это, что имеет значение, используете ли вы временные таблицы или нет? Может быть, вам стоит подумать о добавлении ограничений в таблицу, чтобы сделать это только один раз ...
При этом, честно говоря, лучший способ сделать это для SQL Server 2000 - это, вероятно, использовать таблицу #temp, как вы уже делаете. Если вы пытаетесь удалить все, кроме одного, из каждой пары, то вы можете сделать что-то вроде:
- вставить отдельные строки в отдельную таблицу
- удалить все строки из старой таблицы
- переместить отдельные строки обратно в исходную таблицу
Я также сделал такие вещи, как копирование отдельных строк в новую таблицу, удаление старой таблицы и переименование новой таблицы.
Но это не похоже на цель. Можете ли вы показать код, который вы сейчас используете, с таблицей #temp? Я пытаюсь представить, как вы идентифицируете строки, которые нужно сохранить, и, возможно, просмотр вашего существующего кода вызовет что-то.
РЕДАКТИРОВАТЬ - теперь с более понятными требованиями я могу предложить следующий запрос. Пожалуйста, сначала проверьте копию таблицы!
DELETE a
FROM dbo.TableA AS a
INNER JOIN
(
SELECT columnA, columnB, columnC = MIN(columnC)
FROM dbo.TableA
WHERE columnA IN
(
-- some subqueryA
SELECT 1
)
AND columnB IN
(
-- some subqueryB
SELECT 2 UNION SELECT 3
)
GROUP BY columnA, columnB
) AS x
ON a.columnA = x.columnA
AND a.columnB = x.columnB
AND a.columnC = x.columnC;
Обратите внимание, что это не подтверждает, что есть ровно одна или две строки, которые соответствуют группировке в столбце A и столбце B. Также обратите внимание, что если вы запустите это дважды, он удалит оставшуюся строку, которая все еще соответствует подзапросу!