这个措辞有点困难..
从角色到资产有很多关系。
基于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)
答案 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