Проблема с инкрементной переменной и хранимой процедурой для проверки дубликатов - PullRequest
0 голосов
/ 21 января 2019

У меня проблема с моим procedure. У меня есть таблица oferty_in, которая содержит поля (id, status, ..., id_om). Я хочу процедуру, которая проверяет if exist строки с тем же id_om.

Если существует, удалите строки where status = 'N' (N - новый).

Моя процедура почти работает, но у меня проблема с повторением в цикле. Каждый раз, когда я запускаю свою процедуру, процедура удаляет половину строк. Я не знаю, где проблема ...

DELIMITER //
CREATE PROCEDURE check_duplicates_oferty_in()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE v_id_del BIGINT;

SELECT count(*) INTO n FROM oferty_in where status_oferty = 'N';

SET i=0;

WHILE i<n DO 
IF EXISTS (SELECT id_om FROM oferty_in group by id_om having count(*) >= 2 LIMIT i,1) THEN
SELECT id_om INTO v_id_del FROM oferty_in group by id_om having count(*) >= 2 LIMIT i,1;
DELETE from oferty_in where id_om = v_id_del and status_oferty = 'N';
END IF;
SET i=i+1;

END WHILE;
END
//  

Я также пытаюсь:

IF EXISTS (SELECT id_om FROM oferty_in group by id_om having count(*) >= 2 LIMIT i,1) THEN
    SELECT id_om INTO v_id_del FROM oferty_in group by id_om having count(*) >= 2 LIMIT i,1;
    DELETE from oferty_in where id_om = v_id_del and status_oferty = 'N';
    SET i=i+1;
    ELSE 
    SET i=i+1;
    END IF;

Но это то же самое. Каждый раз половина рядов. Я использую счетчик 'i' и while loop для итераций строка за строкой в ​​oferty_in, когда status = 'N'. У кого-нибудь есть идея, что я сделал не так? Спасибо за помощь и время.

1 Ответ

0 голосов
/ 21 января 2019

Вы, кажется, хотите удалить строки с status = 'N', когда id_om дублируется.

Я хочу процедуру, которая проверяет, существуют ли строки с одинаковым id_om. Если существует, удалите строки, в которых status = 'N' (N - new).

Нерабочий код, как правило, не помогает объяснить логику, поэтому я и делаю это.

Вам определенно не нужны ни циклическая конструкция, ни курсор:

delete o
    from oferty_in o join
         (select o2.id_om
          from oferty_in o2
          group by o2.id_om
          having count(*) > 1 and sum(status = 'N') > 0
         ) o2
         on o.id_om = o2.id_om
    where o.status = 'N';
...