SQL Server CTE查询产生意外结果

3

我有一个像这样的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)。该查询将第一个PartNum“10050857”复制46次(6 +(6 + 10 + 24)),而实际上只应该复制6次,第二个PartNum“10050886”按预期复制10次,最后一个PartNum“10050923”按预期复制24次。
为什么该查询会将第一条记录累加到其后面的记录中进行复制?

它看起来很好,而且运行正常 - http://sqlfiddle.com/#!6/0b685/2 - Nenad Zivkovic
虽然我已经更改了一些列名称以使它运行。因此,您可能在某个地方使用了错误的列,从而导致错误的连接和结果。请仔细检查您的列名称(数量<>我们的数量?) - Nenad Zivkovic
当我在Microsoft SQL Server Management Studio 2012上运行它时,它返回80条记录。 - samb90
还可以查看这个问题 - https://dev59.com/LHTYa4cB1Zd3GeqPtEwy#17570941,获取其他实现同样结果的想法。 - Nenad Zivkovic
1个回答

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!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接