首页 > 解决方案 > 创建 VIEW 以获取连接数

问题描述

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

TABLE (CONNECTION)

ID | REQUEST_PERSON | REQUESTEE_PERSON

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

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

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

标签: sqlsql-serverrdbms

解决方案


这是相当棘手的。这是执行您想要的代码的代码:

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;

是一个 SQL 小提琴。

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

啊!

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

内部聚合只是第二人称的总结。它过滤使用having count(*) = 2以指示外部查询中的两个人都需要连接到内部查询中的第二个人。count(*)假设您没有重复项。

然后,这些被计算在内,这就是你想要的值。


推荐阅读