更新产品订单无效

时间:2014-07-01 10:45:37

标签: sql sql-server tsql sql-server-2012

我有带有(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

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 - 如果还没有孩子的话。小提琴也更新了。