用ORDER BY子句替换UPDATE语句

时间:2018-10-31 19:29:45

标签: sql-server

我很难执行应该包含ORDER BY子句的更新查询,但是我还找不到合适的解决方案。

UPDATE I
SET RefItemID = AQ.ID,
    I.MagParamNum = AQ.MagParamNum
FROM SRO_VT_SHARD.._Items I
JOIN SRO_VT_SHARD.._Inventory INV ON INV.ItemID = I.ID64
JOIN SRO_VT_SHARD.._RefObjCommon ROC ON ROC.ID = I.RefItemID
JOIN _AEQItems AQ ON AQ.TypeID3 = ROC.TypeID3
                  AND AQ.TypeID4 = ROC.TypeID4
WHERE
    INV.Slot BETWEEN 0 AND 13 
    AND INV.Slot != 8 
    AND AQ.ReqLevel1 <= @Data2 
    AND INV.CharID = @CharID
ORDER BY AQ.ReqLevel1 DESC

基本上,如果ORDER BY子句在update语句中可用,则我的查询应该以这种方式工作,但事实并非如此。我可以做些什么来解决这个问题?

非常感谢。

2 个答案:

答案 0 :(得分:4)

您需要确定每个TypeID3 / TypeID4组合要更新的确切行,而在外部查询中不能这样做。您可能需要在此处添加其他ORDER BY子句以打破平局。如果您有一个索引来覆盖_AEQItems中用于搜索要更新的列的列,则可能还希望仅指定列的子集。

;WITH AQ AS
(
  SELECT *, rn = ROW_NUMBER() OVER 
    (PARTITION BY TypeID3, TypeID4 ORDER BY ReqLevel1 DESC)
  FROM _AEQItems
)
UPDATE I
SET RefItemID   = AQ.ID,
    MagParamNum = AQ.MagParamNum
FROM SRO_VT_SHARD.._Items I
JOIN SRO_VT_SHARD.._Inventory INV ON INV.ItemID = I.ID64
JOIN SRO_VT_SHARD.._RefObjCommon ROC ON ROC.ID = I.RefItemID
JOIN AQ ON AQ.TypeID3 = ROC.TypeID3 AND AQ.TypeID4 = ROC.TypeID4
WHERE AQ.rn = 1 
  AND INV.Slot BETWEEN 0 AND 13 
  AND INV.Slot!=8 
  AND AQ.ReqLevel1 <= @Data2 
  AND INV.CharID = @CharID;

答案 1 :(得分:2)

使用子查询:

    UPDATE I
SET RefItemID=AQ.ID,I.MagParamNum=AQ.MagParamNum
FROM SRO_VT_SHARD.._Items I
JOIN SRO_VT_SHARD.._Inventory INV ON INV.ItemID=I.ID64
JOIN SRO_VT_SHARD.._RefObjCommon ROC ON ROC.ID=I.RefItemID
JOIN (SELECT TypeID3, TypeID4, MAX(ReqLevel1) AS ReqLevel1 FROM _AEQItems GROUP BY TypeID3, TypeID4) AQ 
    ON AQ.TypeID3=ROC.TypeID3 
    AND AQ.TypeID4=ROC.TypeID4
WHERE INV.Slot BETWEEN 0 AND 13 AND INV.Slot!=8 AND AQ.ReqLevel1<=@Data2 AND INV.CharID=@CharID