Модераторы: kdv, CyberMax
-
stepan96
- Сообщения: 12
- Зарегистрирован: 15 сен 2005, 11:52
Сообщение
stepan96 » 17 ноя 2006, 13:14
Существует таблица в которой около миллиона записей. В ней необходимо удалить практически все записи. ID записей, которые НЕ НАДО УДАЛЯТЬ находятся во второй таблице. Количество записей во второй таблице около 200 000. Сервер IB 7
Пытаюсь сделать удаление с помощью ХП. Код ниже:
Код: Выделить всё
CREATE PROCEDURE DELETE_RECORDS
AS
DECLARE VARIABLE RECORD_ID INTEGER;
DECLARE VARIABLE CC INTEGER;
BEGIN
FOR SELECT ID
FROM RECORDS INTO :RECORD_ID DO
BEGIN
SELECT
count(*)
FROM
NOTDELETED
WHERE
NOTDELETED.ID = :RECORD_ID
INTO :CC;
IF (CC = 0) THEN
DELETE FROM
RECORDS
WHERE
RECORDS.ID = :RECORD_ID;
END
END
Есть маленькая проблема: не работает
Пожалуйста ткните меня носом, где ошибка.
Заранее спасибо
-
mdfv
- Сообщения: 119
- Зарегистрирован: 23 май 2006, 15:53
Сообщение
mdfv » 17 ноя 2006, 15:09
А чем стандартные методы не подходят?
Код: Выделить всё
DELETE FROM
RECORDS
WHERE
not Exists (select NOTDELETED.ID from NOTDELETED where NOTDELETED.ID=RECORDS.ID)
или
Код: Выделить всё
DELETE FROM
RECORDS
WHERE
not ID in (select ID from NOTDELETED )
-
stepan96
- Сообщения: 12
- Зарегистрирован: 15 сен 2005, 11:52
Сообщение
stepan96 » 17 ноя 2006, 15:36
Насколько я знаю, конструкция IN применяется для наборов не превышающих 1500 элементов, а у меня их 200 тысяч. А вот насчет EXISTS я чтото не подумал
Спасибо
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 17 ноя 2006, 18:23
stepan96 писал(а):Насколько я знаю, конструкция IN применяется для наборов не превышающих 1500 элементов, а у меня их 200 тысяч.
А ты попробуй.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 17 ноя 2006, 20:17
конструкция IN применяется для наборов не превышающих 1500 элементов
это если эти элементы явно перечислены. А если подзапрос - то никаких ограничений нет.
Вот любят люди всякую фигню придумывать...