Сложный 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 |