我有一张这样的桌子:
CREATE TABLE users (id, ...)
CREATE TABLE groups (id, ...)
CREATE TABLE group_roles (group_id REFERENCES pages.id, role, ...)
CREATE TABLE user_memberships (
user_id REFERENCES users.id,
group_role_id REFERENCES group_roles.id,
)
我有一堆
(user_id, group_id)
元组,需要通过 ORM(Sequelize)传递到 Postgres,然后我需要 postgres 删除与我传入的 user_memberships
对相对应的 (user_id, group_id)
行。我还希望所有这些都在一个查询中发生。
我想编写以下代码:
DELETE FROM user_memberships
WHERE (
(
user_id = :user_id_n
AND group_role_id IN (
SELECT id FROM group_roles WHERE group_id = :group_id_n
)
)
)
其中
:user_id_n
和 :group_id_n
是 (user_id, group_id)
元组数组的第 n 个元素。但这不是有效的 pgpsql。有效的 pgpsql 是什么样的?
您的表格定义有点偏离,但
delete
本身并没有什么不起作用的:
CREATE TABLE users (id int primary key);
CREATE TABLE "groups" (id int primary key);
CREATE TABLE pages (id int primary key);
CREATE TABLE group_roles (
id int PRIMARY KEY,
group_id int REFERENCES "groups"(id));
CREATE TABLE user_memberships (
user_id int REFERENCES users(id),
group_role_id int REFERENCES group_roles(id)
);
insert into users select 1;
insert into "groups" select 1;
insert into group_roles select 1,1;
insert into user_memberships select 1,1;
DELETE
完全有效,几乎完全符合您的输入方式:demo at db<>fiddle
DELETE FROM user_memberships
WHERE user_id = 1
AND group_role_id IN
( SELECT id
FROM group_roles
WHERE group_id = 1 );