MS Access SQL Query查找重叠的子组或子集

时间:2015-09-08 14:35:32

标签: sql ms-access

我有两张表显示主要角色和次要角色的组件。已知主要角色"包含"次要角色(组件是相同的),但它们没有这样定义。

编辑:一些次要角色部分但不完全代表主要角色。我只想看到所有组件完全匹配的次要角色。下面的MiRoleY就是一个例子。查询应忽略这些,并返回裸组件

示例:

表1:主要角色

MajorRoleName  Component
MaRoleA         ENTM1
MaRoleA         ENTM2
MaRoleA         ENTM3
MaRoleA         ENTM4
MaRoleA         ENTM5 
MaRoleA         ENTM6
MaRoleA         ENTM7

表2次要角色

MinorRoleName   Component
MiRoleZ          ENTM1
MiRoleZ          ENTM2
MiRoleX          ENTM3
MiRoleX          ENTM4
MiRoleY          ENTM5
MiRoleY          ENTM6
MiRoleY          ENTM8

我想要做的是重新定义主要角色,所以我最终得到:

MajorRoleName Component
MaRoleA         MiRoleZ    
MaRoleA         MiRoleX
MaRoleA         ENTM5
MaRoleA         ENTM6
MaRoleA         ENTM7

我不需要实际更新数据库,此时我只想读取数据(根据它们包含的次要角色获取主要角色的定义)

有没有办法编写一个会显示此问题的查询?

2 个答案:

答案 0 :(得分:0)

这会达到你想要的效果吗?

select distinct majorrolename, minorrolename
from majorroles join
     minorroles
     on majorroles.component = minorroles.component;

答案 1 :(得分:0)

试试这个:

select distinct 
    majorrolename, 
    nz(minorrolename, majorroles.component) as component
from 
    majorroles 
left join (
  select * from minorroles as m1 
  where not exists (
    select * from MinorRoles m2 
    where m2.MinorRoleName = m1.MinorRoleName 
      and m2.Component not in (select Component from MajorRoles)
  ) 
) a on majorroles.component = a.component
order by 2 desc;

这会给你一个结果:

majorrolename   component
MaRoleA         MiRoleZ
MaRoleA         MiRoleX
MaRoleA         ENTM7
MaRoleA         ENTM6
MaRoleA         ENTM5

(使用Access 2010测试)