2013-07-16 33 views
3

我有一个CTE这样的:的SQL Server CTE查询产生意外结果

WITH CTE(PartNum, RowIndex) AS 
(
     -- Anchor Member 
     SELECT 
      PartNum 
      ,CAST(OurQty AS INT) AS RowIndex 
     FROM dbo.RcvDtl 
     WHERE OurQty > 0 
     UNION ALL 
     -- Recursive Member 
     SELECT 
      PartNum 
      ,RowIndex - 1 
     FROM CTE 
     WHERE RowIndex - 1 > 0 
) 
SELECT 
    tbl1.PONum, tbl1.PartNum, 
    CAST(tbl1.OurQty AS INT) AS Quantity, 
    tbl2.RowIndex AS RowIndex 
FROM 
    dbo.RcvDtl AS Tbl1 
INNER JOIN 
    CTE AS Tbl2 ON Tbl1.PartNum = Tbl2.PartNum 
WHERE 
    tbl1.PONum = '63' 
ORDER BY 
    Tbl1.PartNum OPTION(MAXRECURSION 1000) 

以下哪个表上运行:

| PartNum | Quantity 
--------------------- 
    10050857 6 
    10050886 10 
    10050923 24 

查询的想法是复制的记录(PartNum )根据其数量。当查询应该重复6次时,第二部分数字“10050886”由10条记录按预期方式复制第一部分数字“10050857”(46+记录(6 + 10 + 24)),最后一部分数字“10050923”按预期的24记录。

为什么查询通过第一条记录之后的记录累积来复制第一条记录?

+0

它的外观和工作正常 - http://sqlfiddle.com/#!6/0b685/2 –

+0

虽然我已经改变了一些列名称,使其运行。所以你可能在某个地方使用了错误的列,这会导致错误的连接和结果。请仔细检查您的列名(数量<> OurQty?) –

+0

当我在Microsoft SQL Server Management Studio 2012上运行它时,它返回80条记录 – samb90

回答

1

我不得不更改名称一点点,但你的CTE做的工作:

WITH CTE(PartNum, RowIndex) AS 
(
     -- Anchor Member 
     SELECT 
      PartNum 
      ,CAST(OurQty AS INT) AS RowIndex 
     FROM dbo.RcvDtl 
     WHERE OurQty > 0 
     UNION ALL 
     -- Recursive Member 
     SELECT 
      PartNum 
      ,RowIndex - 1 
     FROM CTE 
     WHERE RowIndex - 1 > 0 
) 
SELECT CTE.PartNum, dbo.RcvDtl.OurQty, CTE.RowIndex from CTE INNER JOIN dbo.RcvDtl 
ON CTE.PartNum = dbo.RcvDtl.PartNum 
order by PartNum,RowIndex 

只需再次检查你的代码,它会工作。好戏也是,我喜欢CTE!