在SQL中更新Order字段

时间:2009-11-10 16:24:02

标签: sql sql-server sql-update

我们需要在我们的EventVenue表中添加Ordering,我们通过添加一个int字段来存储EventVenue在订单中的位置。订购基于父事件的ID和事件的VenueGrouping。

如果VenueGrouping为false,将按顺序排序EventVenues。但是,如果为true,则同一事件的EventVenues和从同一父事件派生的EventVenues将具有相同的顺序。例如[假设我们按事件过滤]:

EVID | VenueID | Not Grouped | Grouped
  1  |    1    |      1      |   1
  2  |    2    |      2      |   2
  3  |    2    |      3      |   2
  4  |    3    |      4      |   3

问题在于更改分组时。我需要一些SQL来适当地更新事件的场地排序,但是发现它很难解决问题,特别是当从未分组到分组而没有留下间隙时。

我认为它需要在下面的if语句中,但如果更有效的/ DRY解决方案是合适的,那就更好了:

-- Changing from Ungrouped to Grouped
IF @OldGrouping=0 AND @NewGrouping=1
   BEGIN
      UPDATE EventVenues SET Ordering=...
   END
-- Changing from Grouped to Ungrouped
ELSE IF @OldGrouping=1 AND @NewGrouping=0
   BEGIN
      UPDATE EventVenues SET Ordering=...
   END

任何帮助表示感谢。

根据要求,更多示例数据: 对格式化感到恼火,因此使用了标题键: A = EventVenueID,B = VenueID,C =原始订购,D =更新订购

从Ungrouped更新为Grouped

 A  | B | C | D
101 | 1 | 4 | 3
102 | 2 | 2 | 2
103 | 2 | 3 | 2
104 | 3 | 1 | 1

从分组更新为未分组

 A  | B | C | D
101 | 1 | 3 | 4
102 | 2 | 2 | 2
103 | 2 | 2 | 3
104 | 3 | 1 | 1

1 个答案:

答案 0 :(得分:1)

WITH    rows AS
        (
        SELECT  e.*,
                ROW_NUMBER() OVER (ORDER BY evid) AS rn,
                DENSE_RANK() OVER (ORDER BY venueid) AS dr
        FROM    EventVenues e
        )
UPDATE  rows
SET     Ungrouped = rn,
        Grouped = dr

<强>更新

如果我理解正确,Ordering是根据某些外部参数(未存储在数据库中)更新的一列。

从未分组更新为分组:

WITH    rows AS
        (
        SELECT  e.*,
                DENSE_RANK() OVER (ORDER BY VenueID DESC) AS dr
        FROM    EventVenues e
        )
UPDATE  rows
SET     Ordering = dr

这将按降序Ordering顺序更新VenueID,将相同的订单分配给同一VenueID

要从分组更新为未分组:

WITH    rows AS
        (
        SELECT  e.*,
                ROW_NUMBER() OVER (ORDER BY evid DESC) AS rn
        FROM    EventVenues e
        )
UPDATE  rows
SET     Ordering = rn

这将按降序Ordering顺序更新EVID