我遇到了一个有趣的问题,我试图找到一种高效的解决方法,但它却使我不知所措。
我正在加载一些数据提取,其中包含成千上万的用户,每个用户在多对多关系中至少属于一组。有几十到数百个小组。 组不是分层的,但是它们的成员可以并且确实可以重叠。此结构的简化版本如下:
create table users (
id int not null primary key,
username varchar(100) not null unique
);
create table groups (
id int not null primary key,
groupname varchar(100) not null unique
);
create table users_to_groups (
user_id int not null references users(id),
group_id int not null references groups(id),
constraint pk_users_to_groups primary key (user_id, group_id)
);
组基本上是具有与之相关联的属性(通常是某种统计数据)的填充对象,这些属性可以根据数据类型以不同的方式进行汇总。许多组具有相同的属性类型,但属性值不同,并且有规则确定将哪个属性值应用于该组的成员...但是,重要的是不要“重复计算”信息(例如在某些情况下)其中的用户属于多个组),这将导致一些非常错误的结果。为此,我试图为关联的属性定义“作用域”(由于缺乏更好的术语)。
我将范围定义为“组成一个或多个组的用户的原子集合”,其方式是在范围之间没有重叠,但多个范围可以在多个组中。举例来说,
我希望有4个作用域:
这样,我可以将范围定义为组关系:
我想做的是编写一个查询,以表格形式产生上述结果,例如:
UserId, ScopeId, GroupId
1, 1, 1
2, 1, 1
3, 1, 1
4, 2, 1
4, 2, 2
5, 2, 1
5, 2, 2
6, 3, 2
7, 3, 2
8, 3, 2
9, 4, 3
10, 4, 3
我无法确定如何编写将产生这些结果的查询。有人可以帮忙吗?