-- In SQL 2000 (and earlier) you need to use a correlated SubQuery
--Setup Test Data
CREATE TABLE dbo.OrderDetail
(OrderID int
,ProdID int
,Qty DECIMAL(12,4)
,PriceUtilized MONEY
,LineNum int);
INSERT dbo.OrderDetail (OrderID, ProdID, Qty,PriceUtilized)
VALUES (1,501,30,25.99);
INSERT dbo.OrderDetail (OrderID, ProdID, Qty,PriceUtilized)
VALUES (1,502,300,2.99);
INSERT dbo.OrderDetail (OrderID, ProdID, Qty,PriceUtilized)
VALUES (1,503,301,249.99);
INSERT dbo.OrderDetail (OrderID, ProdID, Qty,PriceUtilized)
VALUES (2,501,3,29.99);
INSERT dbo.OrderDetail (OrderID, ProdID, Qty,PriceUtilized)
VALUES (2,502,40,25.99);
INSERT dbo.OrderDetail (OrderID, ProdID, Qty,PriceUtilized)
VALUES (3,601,7,204.99);
INSERT dbo.OrderDetail (OrderID, ProdID, Qty,PriceUtilized)
VALUES (3,501,2000,25.99);
-- Update Statements Use Correlated SubQuery
UPDATE dbo.OrderDetail SET LineNum = (SELECT COUNT(*)
FROM dbo.OrderDetail ODI
WHERE ODI.OrderID = ORDERDetail.OrderID -- Limits us to the set belonging to one order
AND ODI.PRODID >= ORDERDetail.ProdID -- Enables the Count to mimic Row_Number and
-- determines the order of the Line Nums
)
SELECT ORDERID, PRODID, Qty, PriceUtilized, LineNum
FROM dbo.OrderDetail
Order BY OrderID, LineNum
David Lundell
Principal Consultant and Trainer
www.mutuallybeneficial.com