sql - SQL 从连接中获取顶级对象
问题描述
现在正在处理一个查询,我们想了解哪个企业正在为我们引用最下游的订单。我在这里整理了一个非常基本的表格,用于演示目的,列出了 4 家企业。Bar 和 Donut 最终都是由 Foo 推荐的,我希望能够将 Foo 展示为一家企业已经产生了 X 个订单。显然,获取 Foo(来自 Bar)和 Bar(来自 Donut)的单一推荐是简单的连接。但是你如何从 Bar 回到 Foo 呢?
我要补充一点,我在这个 AM 上做了更多的谷歌搜索,发现了一些关于顶级父级的非常相似的问题,并且大多数回复都建议递归 CTE。我已经有一段时间没有深入研究 SQL 的东西了,但是 8 年前我知道这些东西并不太流行。还有其他方法吗?在订购时将父 ID 存储在订单表上也许更好?
+----+--------+--------------------+
| Id | Name | ReferralBusinessId |
+----+--------+--------------------+
| 1 | Foo | |
| 2 | Bar | 1 |
| 3 | Donut | 2 |
| 4 | Coffee | |
+----+--------+--------------------+
解决方案
WITH RECURSIVE entity_hierarchy AS (
SELECT id, name, parent FROM entities WHERE name = 'Donut'
UNION
SELECT e.id, e.name, e.parent FROM entities e INNER JOIN entity_hierarchy eh on e.id = eh.parent
)
SELECT id, name, parent FROM entity_hierarchy;
推荐阅读
- python - 如何在 Python 中解决这个递归函数?
- java - 在 Recyclerview 中使用 RecyclerView 在 Firestore 中查询要显示的项目
- mysql - MySQL Query - 计算多个表之间的值并按 id 分组
- c# - 如何处理从 bot 框架 v4 中的技能收到的活动?
- docker - 有没有办法在容器中获取容器名称?
- sql - Oracle SQL - 加入和拥有
- ruby-on-rails - 从运行在 Minikube 集群上的 rails 应用程序访问本地 postgres 数据库
- linux - 如何在gid检查下替换文件?
- python - 试图从 git pull 中删除身份验证会创建奇怪的合并冲突和不应该存在的更改
- python - python keras使用计算汉明损失