Postgresql:解析一对多关系并删除给定的元组,全部在一个查询中

问题描述 投票:0回答:1

我有一张这样的桌子:

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 是什么样的?

postgresql sequelize.js plpgsql
1个回答
0
投票

您的表格定义有点偏离,但

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 );
© www.soinside.com 2019 - 2024. All rights reserved.