首页 > 解决方案 > 复杂的多级分层 SQL

问题描述

如何使用 SQL Server 中的查询实现以下结果。

表:shares_info

复杂的多级层次结构:

comp_name investee

APPLE     MS
APPLE     INTEL
APPLE     MRF
APPLE     GOOG
MS        GOOG
MS        MRF
MRF       STF
MRF       ABC
GOOG      INTEL
GOOG      TRF
GOOG      XYZ

这个想法是这样的。APPLE投资了MS、INTEL、MRF、GOOG。等等。现在下面的输入类似于出售我的股票,但首先出售没有依赖关系的股票。这就是我的输出所传达的。如果我想出售 GOOG 股票,那么根据我的以下输入,GOOG 依赖于 INTEL/TRF/XYZ,因此在出售 GOOG 之前,我需要出售 (123, XYZ) 和 (456 INTEL)。接下来,如果我想出售 APPLE,它依赖于 MS/INTEL/MRF/GOOG,因此根据以下输入,我需要先出售 INTEL/MRF/GOOG 才能出售 APPLE。

表:shares_sell_info

一些输入

id  comp_name

123 APPLE
456 APPLE
123 XYZ
789 GOOG
456 INTEL
243 MRF
432 ABC

顺序应如下所示

123 XYZ  (XYZ does not have any dependency and hence should come at the top)
432 ABC (MRF has a dependency on ABC and hence ABC comes on top)
243 MRF (MRF’s dependency is all taken care and hence we have MRF)
456 INTEL (APPLE and GOOGLE has a dependency on INTEL and hence INTEL is on top)
789 GOOG (At this point we can add GOOG because all its dependents are already at top)
123 APPLE (APPLE has a dependency on GOOG and hence GOOG come before APPLE)
456 APPLE

在上面的排序中,XYZ/ABC 中的一个可能是第一个,这并不重要,因为它们都没有任何依赖关系

标签: sqlsql-server

解决方案


小提琴手

WITH 
 cte_com as (SELECT * FROM (VALUES
(123 ,'APPLE'),
(456 ,'APPLE'),
(123 ,'XYZ'),
(789 ,'GOOG'),
(456 ,'INTEL'),
(243 ,'MRF'),
(432 ,'ABC')) as cte_com(id, comp))
,cte_temp as (SELECT * FROM (VALUES
 ('APPLE',     'MS'),  
 ('APPLE',     'INTEL' ),
 ('APPLE',     'MRF' ),
 ('APPLE',     'GOOG' ),
 ('MS',        'GOOG' ),
 ('MS',        'MRF' ),
 ('MRF',       'STF' ),
 ('MRF',       'ABC' ),
 ('GOOG',      'INTEL' ),
 ('GOOG',      'TRF' ),
 ('GOOG',      'XYZ')) as cte_temp(one, two))


 SELECT id, comp , one
     , count(*) as count
 from cte_com
 left join cte_temp on cte_temp.one=cte_com.comp
 group by id, comp, one
 order by count(*)

但目前尚不清楚为什么这个解决方案会给出你想要的顺序。

“XYZ”和“ABC”有什么区别?它们都依赖于其他 1 个组合。

输出:

id  comp    one count
123 XYZ             1
432 ABC             1
456 INTEL           1
243 MRF     MRF     2
789 GOOG    GOOG    3
123 APPLE   APPLE   4
456 APPLE   APPLE   4
7 rows

推荐阅读