我试图用递归的CTE查询创建一个计算成本的材料清单。我遇到的问题是,我需要为材料部件选择一个部件修订版,但是递归查询不允许使用TOP操作符。为了提供更多关于这个问题的信息:
我不知道我能做些什么来解决这个问题。下面是我尝试的SQL代码。
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发布于 2017-01-20 19:09:26
在这种情况下,您需要使用一个窗口函数,您可以在连接到的子查询中使用它,如下所示:
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或其他订购完全,我不知道,因为你没有说。
https://stackoverflow.com/questions/41770598
复制相似问题