存储过程sql server尝试消除重复(多对多关系)

时间:2013-10-29 14:09:07

标签: sql sql-server stored-procedures

这个措辞有点困难..

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

从角色到资产有很多关系。

基于Assets中的列位值。我想将其映射到具有该值的角色。但由于多对多的关系,我获得了无数的角色。所以我想要的是,如果任何资产有位= 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

问题是由于多对多关系,我转为多个rolesID。如果任何公共资产与角色绑定..我想要那个角色,但只有那个角色。如果一个角色与众多资产绑定,一个是1而另一个是0.我仍然希望它被返回(所以如果任何与角色绑定的公共资产返回它)。

AND INVERSE(AKA IS_PUBLIC = 0)

2 个答案:

答案 0 :(得分: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
    )
);

答案 1 :(得分:0)

您正在定义名为Role_Assets的第3个表中的两者之间的关系,因此您必须创建左连接而不是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