Я хочу удалить некоторые вставки из таблицы сведений, а также исключение человека в основной таблице - PullRequest
0 голосов
/ 26 мая 2019

Я получил процедуру для таблицы сведений, в которой я удаляю записи пациентов без назначений (таблица termin).Но теперь я хочу удалить строки из основной таблицы (patient).

Я пробовал это с соединениями, но это не работает

 DELIMITER $$
 DROP PROCEDURE IF EXISTS  delete_patients $$
 CREATE PROCEDURE delete_patients ()
 BEGIN
  DECLARE v_patient_id INT(6); -- Variable für: ID des aktuellen Patienten
 DECLARE v_patient_number INT(64); -- Variable für: Anzahl der Termine des aktuellen Patienten
 DECLARE exit_loop BOOLEAN; -- Status, zeigt an ob alle Datensätze durchlaufen wurden
 DECLARE select_cursor CURSOR FOR
                        SELECT patient_id
                        FROM patient; -- Holt alle Datensätze (Alle Patienten)
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE; -- Der Handler setzt den Status, wenn alle Datensätze (patienten) durchlaufen wurden.
 OPEN select_cursor; -- Öffnet die Datensätze
 select_loop: LOOP -- Startet den Durchlauf aller Datensätze
 FETCH select_cursor INTO v_patient_id; -- Holt immer einen Datensatz (Patienten) und speichert die ID in v_patient_id 
 IF exit_loop THEN -- Gibt es kein Datensatz mehr, wird der Durchlauf beendet.
     CLOSE select_cursor;
     LEAVE select_loop;
 END IF;
    SELECT count(patient_id) INTO v_patient_number FROM termin WHERE patient_id = v_patient_id; -- Zählt die Termine und speichert die Anzahl in v_patient_number 
    IF v_patient_number = 0 THEN -- Sollte v_patient_id gleich 0 sein, also der Patient hat 0 Termine
        DELETE FROM patient WHERE patient_id = v_patient_id; -- Der Patient wurd gelöscht
    END IF;
END LOOP select_loop; -- Ende des Durchlaufs
END $$
DELIMITER ;

1 Ответ

0 голосов
/ 26 мая 2019

Чтобы найти пациентов без предварительной записи, вы можете использовать

select p.*
from patient p
left join termin t on t.patient_id = p.patient_id
where t.patient_id is null

deb-fiddle demo

Это можно преобразовать в оператор DELETE:

delete p
from patient p
left join termin t on t.patient_id = p.patient_id
where t.patient_id is null

ДБ-fiddle demo

Эквивалентный запрос также может быть:

delete p
from patient p
where not exists (
  select *
  from termin t
  where t.patient_id = p.patient_id
)

ДБ-fiddle demo

Вы можете использовать его в своей процедуре, но на самом деле нет необходимости в процедуре.

...