所以我有
- 存储两个人之间不对称连接的表(如 Twitter 关注;不像Facebook 朋友)和
- 存储一个人与各个组的从属关系的表
我的任务是为每个不对称关系找出“发件人”和“发件人”之间共享的从属关系数。
我做了这个蛮力解决方案,但我想知道更聪明的头脑是否能想出更有效的东西。
select frm01.from_person_id, frm01.to_person_id, count(*) num_affl
from
(
select lnk.from_person_id, lnk.to_person_id, ga.grp_id from_grp_id
from links lnk
left outer join grp_affl ga on lnk.from_person_id = ga.person_id
group by lnk.from_person_id, lnk.to_person_id, grp_id
) frm01
inner join
(
select lnk.from_person_id, lnk.to_person_id, ga.grp_id to_grp_id
from links lnk
left outer join grp_affl ga on lnk.to_person_id = ga.person_id
group by lnk.from_person_id, lnk.to_person_id, grp_id
) to01
on (
frm01.from_person_id = to01.from_person_id
and frm01.to_person_id = to01.to_person_id
and frm01.from_grp_id = to01.to_grp_id
)
group by frm01.from_person_id, frm01.to_person_id;
在 Netezza 上使用 ANSI SQL(不允许关联子查询)。
蒂亚!
编辑添加表模式:
table lnk:
from_person_id to_person_id
1 4
2 5
3 6
4 2
5 3
table grp_affl:
person_id grp_id
1 A
1 B
1 C
2 A
3 B
4 C
5 A
5 B
5 C
6 A
expected output:
from_person_id to_person_id num_affl
1 4 1
2 5 1
3 6 0
4 2 0
5 3 1
人 1 和 4 有 1 个共同的从属关系 (C),2 和 5 有共同的 A,5 和 3 有共同的 B。3和6没有共同点。同样 4 和 2。