Сложный SQL запрос на удаление данных из двух таблиц

Как проверить совпадение колонок из Таблицы1 и Таблицы2 и если данные совпадают то удалить запись из Таблицы2 и Таблицы3? Записи в Таблице2 и Таблице3 связаны ключом, но не заданы правила удаления.

У меня пока получился запрос вида:

select * FROM Таблица2
WHERE EXISTS (
  SELECT 1 FROM Таблица1 WHERE Таблица2.поле1 = Таблица1.поле1
);

Ожидаемый результат - удаление данных из Таблицы2 и Таблицы3


Ответы (1 шт):

Автор решения: Akina

Синтетический пример согласованного удаления:

-- тестовые данные
CREATE TABLE t1 (t1id INT, t1val INT);
CREATE TABLE t2 (t2id INT, t2val INT, t1id INT);
CREATE TABLE t3 (t3id INT, t3val INT, t2id INT);
INSERT INTO t1 VALUES (1,11), (2,22), (3,33);
INSERT INTO t2 VALUES(1,111,1), (2,222,2), (4,444,4);
INSERT INTO t3 VALUES (1,1111,1), (3,3333,3), (4,4444,4), (5,5555,5);
SELECT * FROM t1;
SELECT * FROM t2;
SELECT * FROM t3;
t1id t1val
1 11
2 22
3 33
t2id t2val t1id remark
1 111 1 будет удалена, т.к. соответствует записи в табл. 1
2 222 2 будет удалена, т.к. соответствует записи в табл. 1
4 444 4
t3id t3val t2id remark
1 1111 1 будет удалена, т.к. соответствует удалённой записи в табл. 2
3 3333 3
4 4444 4
5 5555 5
WITH cte AS (
  DELETE FROM t2
  USING t1
  WHERE t1.t1id = t2.t1id
  RETURNING t2id
)
DELETE FROM t3
USING cte
WHERE cte.t2id = t3.t2id;
SELECT * FROM t1;
SELECT * FROM t2;
SELECT * FROM t3;
t1id t1val
1 11
2 22
3 33
t2id t2val t1id
4 444 4
t3id t3val t2id
3 3333 3
4 4444 4
5 5555 5

fiddle

→ Ссылка