U8展开BOM的SQL

2019-11-12 14:30:52 人评论 次浏览 分类:Sunlike二次开发

DECLARE @partid INT
SELECT  @partid = 24796;

WITH    parts ( pbom, pid, cbom, cid, lvl, seq, sortseq )
          AS ( SELECT   NULL ,
                        p.ParentId ,
                        p.BomId ,
                        p.ParentId ,
                        0 ,
                        0 ,
                        0
               FROM     dbo.bom_parent AS p
                        JOIN dbo.bom_bom AS b ON b.BomId = p.BomId
               WHERE    b.VersionEffDate <= GETDATE()
                        AND b.VersionEndDate > GETDATE()
                        AND b.BomType = 1
                        and ParentId=@partid
               UNION
               SELECT   p.BomId ,
                        p.ParentId ,
                        cb.BomId ,
                        c.ComponentId ,
                        0 AS lvl ,
                        CAST(ROW_NUMBER() OVER ( PARTITION BY c.BomId ORDER BY c.SortSeq ) AS INT) AS seq ,
                        c.SortSeq
               FROM     dbo.bom_parent AS p
                        JOIN dbo.bom_bom AS b ON b.BomId = p.BomId
                        JOIN dbo.bom_opcomponent AS c ON c.BomId = p.BomId
                        LEFT JOIN dbo.bom_parent AS cb ON c.ComponentId = cb.ParentId
                        LEFT JOIN dbo.bom_bom AS bc ON bc.BomId = cb.BomId
                        --LEFT JOIN dbo.bom_opcomponentopt bo ON c.OptionsId = bo.OptionsId
               WHERE    b.VersionEffDate <= GETDATE()
                        AND b.VersionEndDate > GETDATE()  and p.ParentId=@partid
                        AND ( ( bc.VersionEffDate <= GETDATE()
                                AND bc.VersionEndDate > GETDATE()
                                AND bc.BomType = 1
                              )
                              OR bc.BomId IS NULL
                            )
             ),
        bom
          AS ( SELECT   parts.pid AS ancestor ,
                        parts.pbom ,
                        parts.pid ,
                        parts.cbom ,
                        parts.cid ,
                        parts.lvl ,
                        parts.seq ,
                        parts.sortseq ,
                        CAST('01' AS NVARCHAR(50)) AS pseq
               FROM     parts
               WHERE    parts.pbom IS NULL
                        AND parts.pid = @partid
               UNION ALL
               SELECT   p.ancestor ,
                        c.pbom ,
                        c.pid ,
                        c.cbom ,
                        c.cid ,
                        p.lvl + 1 ,
                        c.seq ,
                        c.sortseq ,
                        CAST(p.pseq + '.' + RIGHT('00' + CAST(c.seq AS NVARCHAR(50)), 2) AS NVARCHAR(50))
               FROM     parts AS c
                        JOIN bom AS p ON p.cbom = c.pbom
             )
    SELECT  *
    FROM    bom AS b
    ORDER BY b.pseq
    OPTION  ( HASH JOIN, MAXRECURSION 10 );

上一篇:没有了

下一篇:没有了

相关技术

    暂无相关的资讯...