首页 > 解决方案 > 如何排除特定表寄存器中的查询

问题描述

我想在查询中嵌套一些数据。我列出用户,然后显示一个按钮来编辑权限,它会发送 user_id 并查询他拥有哪些权限。有两个表:

允许

    CREATE TABLE IF NOT EXISTS permission(
      id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
      name varchar(200) NOT NULL,
      platform varchar(200) NOT NULL,
    );

users_permission

    CREATE TABLE IF NOT EXISTS users_permission(
      id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
      users_id uuid NOT NULL REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
      permission_id uuid NOT NULL REFERENCES permission(id) ON UPDATE CASCADE ON DELETE CASCADE,
      create_active boolean NOT NULL,
      read_active boolean NOT NULL,
      update_active boolean NOT NULL,
      delete_active boolean NOT NULL,
      is_active boolean NOT NULL DEFAULT true
    );

users_permission 从 users 表接收一个 uuid。考虑到这一点,我怎么能做一个查询: - 从 users_permission 获取所有结果;-获取权限的所有结果,但不包括users_permission中已经使用的结果(与users_id相关的结果)。

如果它与任何寄存器中的 users_permission 表相关,我通常可以排除它,但我想显示用户特定的权限。

总结一下,我应该如何使用 SQL 来获取特定用户的权限列表,以及链接 (users_permission) 和未链接 (permission) 权限?

标签: sqlpostgresql

解决方案


下面的这个查询解决了我的问题

SELECT
    UP.users_id,
    P.id as permission_id, 
    P.name as permission_name
    FROM users_permission UP
LEFT JOIN permission P
    on P.id = UP.permission_id
where UP.users_id = someUserId
UNION
SELECT
    null,
    P.id as permission_id, 
    P.name as permission_name
FROM   permission P
where  NOT EXISTS
  (SELECT *
   FROM   users_permission
   WHERE  users_permission.permission_id = P.id
  AND users_permission.users_id = someUserId)

推荐阅读