首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不允许在递归公共表表达式的递归部分中使用顶部或偏移运算符。

不允许在递归公共表表达式的递归部分中使用顶部或偏移运算符。
EN

Stack Overflow用户
提问于 2017-01-20 18:57:56
回答 1查看 2.4K关注 0票数 1

我试图用递归的CTE查询创建一个计算成本的材料清单。我遇到的问题是,我需要为材料部件选择一个部件修订版,但是递归查询不允许使用TOP操作符。为了提供更多关于这个问题的信息:

  • 部件修订(PartRev表)作为物料清单,由许多材料(PartMtl表)组成。
  • 材料单上的材料也可以有自己的材料。要得到这一点,我们需要材料部分(已经有这个)和它的修订。然而,我们的ERP系统并没有记录材料部分的修改(我们没有开发ERP系统,所以我们不能改变这一点)。这是相当计算的动态和一个单一的记录选择。
  • Server不允许在递归查询中使用TOP操作符,因此我无法选择一个修订。

我不知道我能做些什么来解决这个问题。下面是我尝试的SQL代码。

代码语言:javascript
运行
复制
WITH CostedBOMFinance AS
(
select 
    Erp.PartRev.PartNum, 
    Erp.PartRev.RevisionNum,
    case when Erp.PartMtl.ViewAsAsm = 1 then 'Asm' else 'Mtl' end as MtlType,
    Erp.PartMtl.MtlSeq as Seq,
    Erp.PartMtl.MtlPartNum,
    (
        select TOP(1) Erp.PartRev.RevisionNum
        from Erp.PartRev as MtlRev
        where MtlRev.Approved = 1 and
              MtlRev.PartNum = Erp.PartMtl.MtlPartNum
    ) as MtlRev,
    Erp.Part.PartDescription,
    Erp.PartMtl.QtyPer,
    Erp.PartMtl.UOMCode,
    Erp.PartCost.StdBurdenCost,
    Erp.PartCost.StdLaborCost,
    Erp.PartCost.StdMaterialCost as StdUnitCost,
    Erp.PartCost.StdSubContCost,
    Erp.PartCost.StdBurdenCost + Erp.PartCost.StdLaborCost + Erp.PartCost.StdMaterialCost + Erp.PartCost.StdSubContCost as TotalStdCost,
    1 as Level
from Erp.PartRev
join Erp.PartMtl on Erp.PartMtl.Company = Erp.PartRev.Company and
                    Erp.PartMtl.PartNum = Erp.PartRev.PartNum and
                    Erp.PartMtl.RevisionNum = Erp.PartRev.RevisionNum
join Erp.Part on Erp.Part.Company = Erp.PartMtl.Company and
                 Erp.Part.PartNum = Erp.PartMtl.MtlPartNum
join Erp.PartCost on Erp.PartCost.Company = Erp.Part.Company and
                     Erp.PartCost.PartNum = Erp.Part.PartNum

UNION ALL

select 
    Erp.PartRev.PartNum, 
    Erp.PartRev.RevisionNum,
    case when Erp.PartMtl.ViewAsAsm = 1 then 'Asm' else 'Mtl' end as MtlType,
    Erp.PartMtl.MtlSeq as Seq,
    Erp.PartMtl.MtlPartNum,
    (
        select TOP(1) MtlRev.RevisionNum
        from Erp.PartRev as MtlRev
        where MtlRev.Approved = 1 and
              MtlRev.PartNum = Erp.PartMtl.MtlPartNum
    ) as MtlRev,
    Erp.Part.PartDescription,
    Erp.PartMtl.QtyPer,
    Erp.PartMtl.UOMCode,
    Erp.PartCost.StdBurdenCost,
    Erp.PartCost.StdLaborCost,
    Erp.PartCost.StdMaterialCost as StdUnitCost,
    Erp.PartCost.StdSubContCost,
    Erp.PartCost.StdBurdenCost + Erp.PartCost.StdLaborCost + Erp.PartCost.StdMaterialCost + Erp.PartCost.StdSubContCost as TotalStdCost,
    Level + 1
from Erp.PartRev
join Erp.PartMtl on Erp.PartMtl.Company = Erp.PartRev.Company and
                    Erp.PartMtl.PartNum = Erp.PartRev.PartNum and
                    Erp.PartMtl.RevisionNum = Erp.PartRev.RevisionNum
join Erp.Part on Erp.Part.Company = Erp.PartMtl.Company and
                 Erp.Part.PartNum = Erp.PartMtl.MtlPartNum
join Erp.PartCost on Erp.PartCost.Company = Erp.Part.Company and
                     Erp.PartCost.PartNum = Erp.Part.PartNum
join CostedBOMFinance as CostedBOMFinanceParent on CostedBOMFinanceParent.PartNum = Erp.PartMtl.MtlPartNum and
                                                CostedBOMFinanceParent.RevisionNum = MtlRev
)

select * from CostedBOMFinance
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-20 19:09:26

在这种情况下,您需要使用一个窗口函数,您可以在连接到的子查询中使用它,如下所示:

代码语言:javascript
运行
复制
SELECT 
-- ...
  MtlRev.RevisionNum,
-- ...
from Erp.PartRev
join (
  select RevisionNum, PartNum,
         ROW_NUMBER() OVER (Partition By PartNum ORDER BY RevisionNum) AS RN
  from Erp.PartRev as MtlRev
  where MtlRev.Approved = 1
) AS MtlRev ON MtlRev.PartNum = Erp.PartMtl.MtlPartNum and MtlRev.RN = 1
-- ...

注:您可能需要ORDER BY RevisionNum DESC或其他订购完全,我不知道,因为你没有说。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41770598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档