3

私はCTEクエリを持っていますが、それについての概念は何もありません。そして、私はプログラミングに不慣れです。実際、クエリにQty列があり、qtyまで行を繰り返したいです。qtyが50に等しい場合、データセットは50の時間レコードを返します。qtyが1000千に等しい場合、クエリは10000千レコードを返します。次のクエリは、99 rcords未満になるまでは問題なく機能し、1000rocordで成長するにはどうすればよいですか。

よろしくお願いします。

SELECT * INTO #TableA
FROM
(

SELECT MIS_Request_Detail.vno, MIS_Request_Detail.IID
       , MIS_Request_Detail.Qty-MIS_Request_Detail.BalQty qty, 
       1 RcvdQty, pk,
       ItmMstr.IName, ItmMstr.UName, '' SrNo,
       MIS_Request_Detail.Qty As ReqQty, MIS_Request_Detail.BalQty
       , MIS_Request_Detail.Qty-MIS_Request_Detail.BalQty RemainQty
FROM MIS_Request_Detail INNER JOIN
view_MIS_Item_Master ItmMstr ON ItmMstr.IID=MIS_Request_Detail.IID
WHERE ReqType=1 AND MIS_Request_Detail.vno=@vno 

) T
;WITH Nbrs ( Number ) AS (
SELECT 1 UNION ALL
SELECT 1 + Number FROM Nbrs WHERE Number < 99 
)

SELECT A.vno,A.IID, A.IName, A.UName, CAST(SrNo AS VARCHAR(50)) SrNo
   , CAST(N.Number AS varchar(50)) QTY, pk ReqDetpk, RcvdQty,
   A.ReqQty, A.BalQty, A.RemainQty, 0 Color,  0 chked, 0 Pk, 0 AS isupdate
   , '' AS isdeleted
FROM #TableA A
JOIN Nbrs N ON N.Number <= A.qty
ORDER BY IID, N.Number, pk 
4

2 に答える 2

0

ご存知かもしれませんが、再帰CTEの再帰制限は99です。これを回避するには、ItzikBen-GanによるSQLMagazineの記事にあるように、一連のCROSSJOINを使用する必要があります。

WITH
L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
L4   AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
L5   AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5)
SELECT n FROM Nums

これにより、最大40億までの数字が得られます。

于 2012-11-19T03:18:58.790 に答える
0

#TableAで、一時テーブルに1を超える識別子と行数が含まれていない場合にIDを追加します

SELECT * INTO #TableA
FROM
(
 SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS Id,
        MIS_Request_Detail.vno, MIS_Request_Detail.IID
        , MIS_Request_Detail.Qty-MIS_Request_Detail.BalQty qty, 
        1 RcvdQty, pk,
        ItmMstr.IName, ItmMstr.UName, '' SrNo,
        MIS_Request_Detail.Qty As ReqQty, MIS_Request_Detail.BalQty
        , MIS_Request_Detail.Qty-MIS_Request_Detail.BalQty RemainQty
FROM MIS_Request_Detail INNER JOIN
  view_MIS_Item_Master ItmMstr ON ItmMstr.IID=MIS_Request_Detail.IID
WHERE ReqType=1 AND MIS_Request_Detail.vno=@vno 
) T

;WITH Nbrs(Id, vno, IID, IName, UName, SrNo, QTY, ReqDetpk, RcvdQty, ReqQty, 
           BalQty, RemainQty, Color, chked, Pk, isupdate, isdeleted, [Level]) AS (
SELECT A.Id, A.vno,A.IID, A.IName, A.UName, CAST(SrNo AS VARCHAR(50)) SrNo
       , CAST(N.Number AS varchar(50)) QTY, pk ReqDetpk, RcvdQty,
       A.ReqQty, A.BalQty, A.RemainQty, 0 Color,  0 chked, 0 Pk, 0 AS isupdate
       , '' AS isdeleted, 1 AS [Level]
FROM #TableA A
UNION ALL
SELECT A.Id, A.vno,A.IID, A.IName, A.UName, CAST(SrNo AS VARCHAR(50)) SrNo
       , CAST(N.Number AS varchar(50)) QTY, pk ReqDetpk, RcvdQty,
       A.ReqQty, A.BalQty, A.RemainQty, 0 Color,  0 chked, 0 Pk, 0 AS isupdate
       , '' AS isdeleted, n.[Level] + 1
FROM #TableA A JOIN Nbrs n ON A.Id = n.Id
WHERE A.Number > n.[Level]
)
SELECT *
FROM Nbrs
ORDER BY IID, N.Number, pk 
于 2012-11-19T06:13:31.673 に答える