创建一个视图以获取连接数

Creating a VIEW to get a connection count

我有一个 table 下面存储了 2 个人之间的联系

TABLE (CONNECTION)

ID | REQUEST_PERSON | REQUESTEE_PERSON

我想构建一个 VIEW,它获取 REQUEST_PERSON、REQUESTEE_PERSON 和 MUTUAL_CONNECTION_COUNT(它们之间的其他公共连接计数)。感谢任何帮助

例如,如果我们有一个 table 数据如下

ID | REQUEST_PERSON | REQUESTEE_PERSON
1    A                B
2    A                C
3    B                C
4    D                B
5    D                A
6    A                E
7    B                E
8    A                F
9    C                G

我需要下面的VIEW显示

ID | REQUEST_PERSON | REQUESTEE_PERSON  | MUTUAL_CONNECTION_COUNT
1    A                B                   3
2    A                C                   1
3    B                C                   1
4    D                B                   1
5    D                A                   1
6    A                E                   1
7    B                E                   1
8    A                F                   0
9    C                G                   0

这有点棘手。这是执行您想要的操作的代码:

select c.*,
       (select count(*)
        from (select v.person2
              from connections c2 cross apply
                   (values (c2.REQUESTEE_PERSON, c2.REQUEST_PERSON), (c2.REQUEST_PERSON, c2.REQUESTEE_PERSON)
                   ) v(person1, person2)
              where v.person1 IN (c.Request_Person, c.Requestee_Person) 
              group by v.person2
              having count(*) = 2
             ) v
       ) in_common    
from connections c
order by id;

Here 是 SQL Fiddle.

问题的本质是找到与每一行中的两个人都有联系的人。您的连接是单向的,这使得逻辑难以表达 -- C 可以是任一连接中的第一人称或第二人称。

啊!

因此,最里面的子查询向图中添加了反向链接。然后,它可以专注于第一个人的过滤——他必须与外部查询中的人相匹配。第二人称可能是共同点

内聚合只是第二个人总结的。它使用 having count(*) = 2 进行过滤,以指示外部查询中的两个人都需要与内部查询中的第二个人相关联。 count(*) 假定您没有重复项。

然后,统计这些,就是你要的值。