SQL Server中所有子项的递归查询

时间:2018-06-19 14:10:49

标签: sql sql-server

我在论坛上搜索了一个问题,因为我没有找到一个问题,因此我开始了一个新主题

我有一个名为SubProduct的表,其结构如下:

ProductCode    | SubProduct    | Unit    
11470060       | 11470060.DSP  |  12    
11470060.DSP   | 11470060.EA   |  12    
12110957       | 12110957.DSP  |  12    
12110957.DSP   | 12110957.EA   |  50

我需要得到这个结果,但我无法达到它:

Parent             Child            Unit    
11470060       | 11470060.DSP  |  12    
11470060       | 11470060.EA   |  144 (12 * 12)     
12110957       | 12110957.DSP  |  12    
12110957       | 12110957.EA   |  600 (12 * 50)

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

您需要标识父级,您可以使用字符串操作来完成。然后,您可以使用join进行乘法。

以下内容以略有不同的形式返回您想要的内容:

with sp as (
      select sp.*,
             left(productcode, charindex('.', productcode + '.') - 1) as parent
      from subproduct sp
     )
select spd.parent, spd.unit * spe.unit,
       spd.subproduct as dsp_subproduct, spe.subproduct as ea_subproduct
from sp spd join
     sp spe
     on spd.parent = spe.parent and
        spd.subproduct like '%.DSP' and
        spe.subproduct like '%.EA';

您可以使用apply在单独的行上获取此信息:

with sp as (
      select sp.*,
             left(productcode, charindex('.', productcode + '.') - 1) as parent
      from subproduct sp
     ) 
select spd.parent, v.subproduct, v.unit
from sp spd join
     sp spe
     on spd.parent = spe.parent and
        spd.subproduct like '%.DSP' and
        spe.subproduct like '%.EA' outer apply
     (values (spd.subproduct, spd.unit), (spe.subproduct, spd.unit * spe.unit) ) v(subproduct, unit);

Here是演示该解决方案的一个月。