我有带有(Name,ParentID,Order)列的Products表。我有一个插入语句,用于保存插入的子产品。插入后我需要更新订单,
我有以下SQL,
UPDATE Products
SET [Order] = (SELECT ISNULL(MAX([Order]), 0) + 1 FROM Products WHERE ParentID = CP.ParentID)
FROM Products P
INNER JOIN #InsertedChildProduct CP ON (CP.ID = P.ID)
问题是我正在更新刚插入的产品的订单,但[订单]无效。如果我有,
Products
--------
ParentID Order
----------------
1 1
1 2
并且假设我已经插入了2个子产品,那么该表应该是,
Products
--------
ParentID Order
----------------
1 1
1 2
1 3
1 4
但我看到了,
Products
--------
ParentID Order
----------------
1 1
1 2
1 3
1 3
答案 0 :(得分:0)
请尝试这样做,您需要先在内部查询中获取MAX()
UPDATE P
SET [Order] = X.newval
FROM Products P
JOIN
(
SELECT ID, (ISNULL(MAX([Order]), 0) + 1) as newval
FROM Products P
JOIN #InsertedChildProduct ip
on P.ParentID = ip.ParentID
group by ID
) X
ON X.ID = P.ID
答案 1 :(得分:0)
您可以尝试这一点,取自here上的答案:
declare @MaxNumber int
set @MaxNumber = 0
UPDATE Products
SET [Order] = @MaxNumber, @MaxNumber = (SELECT ISNULL(MAX([Order]), 0)
FROM Products
WHERE ParentID = CP.ParentID) + 1
FROM Products P
INNER JOIN #InsertedChildProduct CP ON (CP.ID = P.ID)
答案 2 :(得分:0)
考虑到这一系列不同的方法,如果不对两个数据集施加顺序,即使是任意的,也无法看到它如何工作。这是一种方法(小提琴 - 确保首先构建架构,然后运行代码):http://www.sqlfiddle.com/#!3/d34df/3)
WITH cteRN_c
AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RN_c,
ID
FROM #InsertedChildProduct
),
cteRN_p
AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY ParentID ORDER BY [Order]) AS RN_p,
ParentID,
[Order]
FROM Products
WHERE [Order] IS NULL
)
UPDATE p
SET [Order] = (SELECT ISNULL(MAX([ORDER]), 0) FROM Products WHERE ParentID = p.ParentID) + c.RN_c
FROM cteRN_p p INNER JOIN cteRN_c c
ON p.ParentID = c.ID AND
p.RN_p = c.RN_c;
我们通过在CTE中通过ROW_NUMBER向临时表集和父集添加任意行号来强制执行命令。从那时起,只需要在正确的数据点上加入CTE,并针对父CTE运行更新。当然,任意哪个孩子会按顺序编号,但至少会发生这种情况。
编辑:在查询的MAX部分忘记了ISNULL - 如果还没有孩子的话。小提琴也更新了。