【问题标题】:SQL get top level object from joinsSQL 从连接中获取顶级对象
【发布时间】:2020-08-20 14:45:25
【问题描述】:

现在正在处理一个查询,我们希望了解哪个企业为我们提供了最多的下游订单。我在这里整理了一个非常基本的表格,用于演示目的,列出了 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 |                    |
+----+--------+--------------------+

【问题讨论】:

  • 使用 Postgresql 你可以使用WITH RECURSIVE...
  • @RSolberg 您使用的是什么版本的 SQL?
  • @JasonTowne 我很确定它是版本 12 (SQL Azure)
  • @RSolberg 我的答案中的分层查询是否可以显示从DonutFoo 的关系路径?

标签: sql join azure-sql-database


【解决方案1】:
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;

SQL Fiddle Example

【讨论】:

    【解决方案2】:

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

     declare @tbl as table (Id int, Name varchar(30), ReferralBusinessId int)
    
      insert into @tbl (id, Name, ReferralBusinessId) values
      (1, 'Foo', null),
      (2, 'Bar', 1),
      (3, 'Donut', 2),
      (4, 'Coffee', null);
    
      ;WITH business AS (
            SELECT Id, Name, ReferralBusinessId 
            , 0 AS Level
            , CAST(Id AS VARCHAR(255)) AS Path
            FROM @tbl 
            
            UNION ALL
    
            SELECT R.Id, R.Name, R.ReferralBusinessId
            , Level + 1
            , CAST(Path + '.' + CAST(R.Id AS VARCHAR(255)) AS VARCHAR(255))
            FROM @tbl R
            INNER JOIN business b ON b.Id = R.ReferralBusinessId
        )
    
        SELECT * FROM business ORDER BY Path 
    

    【讨论】:

    • 我稍后会在这个高峰。
    猜你喜欢
    • 2021-03-06
    • 2011-10-24
    • 1970-01-01
    • 2020-03-12
    • 2017-05-10
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多