代码之家  ›  专栏  ›  技术社区  ›  Zephyr

如何标记联接表中存在值的一个表中的行?

  •  0
  • Zephyr  · 技术社区  · 6 年前

    对于我的查询,我有两个表,定义如下:

    权限 表:

    | permission_id | permission_description |
    |---------------|------------------------|
    |             1 | Create User            |
    |             2 | Edit User              |
    |             3 | Delete User            |
    

    用户权限 表:

    | permission_id | user_id |
    |---------------|---------|
    |             1 |       1 |
    |             1 |       2 |
    |             3 |       2 |
    |             3 |       5 |
    |             1 |       3 |
    |             3 |       1 |
    

    现在,我需要检索 全部的 中的权限 permissions 表,其中有一列指示用户 user_id 属于 1 中的每个权限都存在 users_permissions 表。

    所以,我的 期望输出 因为查询将是:

    | permission_id | permission_description | has_permission |
    |---------------|------------------------|----------------|
    |             1 | Create User            | TRUE           |
    |             2 | Edit User              | FALSE          |
    |             3 | Delete User            | TRUE           |
    

    到目前为止,我尝试了以下查询,但它返回所有 权限 以及所有 用户标识 价值观:

    SELECT permissions.permission_id,
           permission_description,
           CASE WHEN user_id = 1 THEN 'TRUE' ELSE 'FALSE' END AS has_permission
    FROM permissions
           INNER JOIN users_permissions ON permission.permission_id = users_permissions.permissions_id;
    

    我怎么才能把这个限制在一个条目 permission ?


    为了清晰起见,最终目标是获取可用权限的列表并标记用户已经拥有的权限。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Dale K    6 年前

    如果您只想知道一个用户的答案,那么 exists subquery 将完成任务-无需加入。

    SELECT P.permission_id
      , P.permission_description
      , CASE WHEN exists (select 1 from users_permissions UP where UP.permission_id = P.permission_id and UP.user_id = 1) THEN 'TRUE' ELSE 'FALSE' END AS has_permission
    FROM [permissions] P
    

    PS-我不建议有一个叫 permissions 作为SQL Server中的保留字。

        2
  •  0
  •   Derviş Kayımbaşıoğlu    6 年前

    使用 LEFT JOIN 而不是 INNER JOIN 并检查 if it is null

    select permissions.permission_id,
           permission_description,
           case when user_id is null then 'FALSE' else 'TRUE' END as has_permission
    FROM permissions
    LEFT JOIN users_permissions 
      ON permission.permission_id = users_permissions.permissions_id and user_id = 1