我们需要在我们的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 =更新订购
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
答案 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
。