0

正确地措辞有点困难..

  • 表 A 有作用
  • 表 B 将角色与资产联系起来
  • 表 C 用于资产

从角色到资产存在多对多关系。

基于资产中的列位值。我想将其映射到具有该值的角色。但由于多对多的关系,我得到了许多角色。所以我想要的是,如果任何资产的 bit = 1 返回等效角色。我不希望角色重复 PK。我返回重复角色(通过 PK)的查询如下所示。

select rls.Role_ID, 
       asset.Asset_ID, 
       Asset.Is_Public

        from Roles rls
            inner join Role_Asset on rls.Role_ID = Role_Asset.Role_ID
            inner join Asset on Role_Asset.Asset_ID = asset.Asset_ID 
            where Asset.Is_Public =1

问题是由于多对多关系,我变成了许多角色ID。如果任何公共资产与角色相关联。我想要那个角色,但只有那个角色。如果一个角色与许多资产相关联,一个为 1,另一个为 0。我仍然希望它返回(因此,如果它与一个角色绑定的任何公共资产返回它)。

反之(又名 IS_PUBLIC=0)

4

2 回答 2

0

您在名为 Role_Assets 的第三个表中定义两者之间的关系,因此您必须创建左连接而不是 INNER,因为内连接将排除不匹配的值。此外,您必须从复合表中选择 ROLEID,而不是使用 ROLES_table。通过这种方式,您将最终获得所有将公共资产设为 TRUE 的角色。换句话说,您的结果集将如下所示:

     ROLE ID          ASSET ID      PUBLIC
      1                  1            1
      1                  2            1
      1                  3            1
      2                  1            0
      2                  2            0
于 2013-10-29T14:59:36.037 回答
0

尝试在 WHERE 子句中使用 EXISTS 语句,如下所示:

SELECT rls.Role_ID
FROM Roles rls
WHERE EXISTS (
    SELECT 1
    FROM Role_Asset ra
    WHERE ra.Role_ID = rls.Role_ID
    AND EXISTS (
        SELECT 1
        FROM Asset a
        WHERE a.Asset_ID = ra.Asset_ID
        AND a.Is_Public = 1
    )
);
于 2013-10-29T14:51:56.393 回答