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)) だけ複製し、2 番目の PartNum '10050886' は予想どおり 10 レコードだけ複製し、最後の部分番号 '10050923' を複製します。予想通り 24 レコード。

最初のレコードに続くレコードの累積によって、クエリが最初のレコードを複製するのはなぜですか?

4

1 に答える 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 も大好きです。

于 2013-07-27T03:56:13.457 に答える