SQL从联接中获取顶级对象

问题描述

现在正在处理查询,我们希望了解哪个企业为我们提供了最下游的订单。我在这里列出了一个非常基本的表格用于演示,列出了4个企业。 Bar和Donut最终都由Foo推荐,我希望能够向Foo展示,因为一家企业产生了X笔订单。显然,获得Foo(来自Bar)和Bar(来自Donut)的单个推荐是简单的联接。但是您如何从Bar回到Foo?

我要补充一点,我在这个上午做了更多的谷歌搜索,发现一些关于顶级父级的非常相似的问题,并且大多数回答都暗示了递归CTE。自从我深入研究sql东西已经有一段时间了,但是8年前,我知道它们并不太流行。还有其他解决方法吗?在订购时将父ID存储在订购表中也许更好?

+----+--------+--------------------+
| Id |  Name  | ReferralBusinessId |
+----+--------+--------------------+
|  1 | Foo    |                    |
|  2 | Bar    |                  1 |
|  3 | Donut  |                  2 |
|  4 | Coffee |                    |
+----+--------+--------------------+

enter image description here

解决方法

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,parent FROM entity_hierarchy;

SQL Fiddle Example

,

假设您使用的是SQL Server,则可以使用下面的查询来为特定业务生成分层的ID路径。

client.on('messageReactionAdd',async (reaction,user) => {
if (reaction.emoji.name === '?') {
let role = message.guild.roles.cache.find(role => role.name === 'rolename');
if (message.channel.name !== 'channelname') {
  return;
} else {
  message.member.addRole(roleid);
}
}
});

enter image description here