PostgreSQL 从多个表中删除外连接的行
PostgreSQL delete rows that outer join from multiple tables
我正在尝试从 table 中删除其他 2 个故事中不存在 ID 的行。在 PostgreSQL 上:
table答:
idB
idC
age
1
4
Three
2
5
Three
3
6
Three
table乙:
idB
name
age
3
Two
Three
7
Two
Three
table C:
idC
name
age
4
Two
Three
5
Two
Three
6
Two
Three
最终 table A :
idB
idC
age
3
6
Three
应删除 table A 的第一行,因为 idC = 4 在 table C 中不存在
table A 的第二行应该删除,因为 idB = 2 在 table B 中不存在
第三行 table A 应该保留 idB = 3 存在于 table B 和 idC = 6 存在于 table C
我该怎么做?
这里是你如何做到的:
with tt as (
select a.* from tableA a
left join tableB b on a.idb =b.idb
left join tableC c on a.idC = c.idc
where b.idb is null or c.idc is null
)
delete from tableA a
using tt
where a.idB = tt.idB
and a.idC = tt.idC
只需使用not exists
:
delete from tableA a
where not exists (select 1 from tableB b where b.idB = a.idB) or
not exists (select 1 from tableC c where c.idC = a.idC);
我正在尝试从 table 中删除其他 2 个故事中不存在 ID 的行。在 PostgreSQL 上:
table答:
idB | idC | age |
---|---|---|
1 | 4 | Three |
2 | 5 | Three |
3 | 6 | Three |
table乙:
idB | name | age |
---|---|---|
3 | Two | Three |
7 | Two | Three |
table C:
idC | name | age |
---|---|---|
4 | Two | Three |
5 | Two | Three |
6 | Two | Three |
最终 table A :
idB | idC | age |
---|---|---|
3 | 6 | Three |
应删除 table A 的第一行,因为 idC = 4 在 table C 中不存在 table A 的第二行应该删除,因为 idB = 2 在 table B 中不存在 第三行 table A 应该保留 idB = 3 存在于 table B 和 idC = 6 存在于 table C
我该怎么做?
这里是你如何做到的:
with tt as (
select a.* from tableA a
left join tableB b on a.idb =b.idb
left join tableC c on a.idC = c.idc
where b.idb is null or c.idc is null
)
delete from tableA a
using tt
where a.idB = tt.idB
and a.idC = tt.idC
只需使用not exists
:
delete from tableA a
where not exists (select 1 from tableB b where b.idB = a.idB) or
not exists (select 1 from tableC c where c.idC = a.idC);