sql - 创建 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
解决方案
这是相当棘手的。这是执行您想要的代码的代码:
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(*)
假设您没有重复项。
然后,这些被计算在内,这就是你想要的值。
推荐阅读
- php - Mysql子猫和父猫的帖子[数据库模式]
- java - 为什么apache spark在尝试获取spark配置时抛出异常
- swift - 向下滚动表格视图时添加分页
- c++ - 字符串流的用户定义文字
- javascript - 选择选项时打开对话框的角度
- java - 是否可以在 Spring Data 中使用 ProjectionOperation 来投影数组项?
- c# - FloatingTextManager 中的 Unity 空对象
- java - Spring Cloud config 中的 spring.cloud.config.label 属性有什么作用?
- arrays - 如何像数组一样打印一组值?我不想打印所有值只是我想打印不。字母
- iphone - 使用 Firebase JS SDK 的应用程序检查 Expo/React Native 应用程序