创建 VIEW 以获取连接数

问题描述

我下面有一张表格,其中存储了 2 个人之间的联系

TABLE (CONNECTION)

ID | REQUEST_PERSON | REQUESTEE_PERSON

我想构建一个获取 REQUEST_PERSON、REQUESTEE_PERSON 和 MUTUAL_CONNECTION_COUNT(它们之间的其他常见连接数)的 VIEW。任何帮助表示赞赏

例如,如果我们有如下表格数据

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(*) 假定您没有重复项。

然后,把这些都算出来,就是你想要的值。