Обновление поля Порядок в SQL - PullRequest
1 голос
/ 10 ноября 2009

Нам необходимо добавить Ordering в нашу таблицу EventVenue, что мы сделали, добавив поле int для хранения размещения EventVenue в заказе. Порядок определяется на основе идентификатора родительского события и группы мероприятий.

Если VenueGrouping имеет значение false, EventVenues будут упорядочены последовательно. Однако, если true, EventVenues для одного и того же события и полученные из одного и того же родительского события будут иметь одинаковый порядок. Например, [если мы отфильтровали по событию]:

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

Проблема в том, когда группировка меняется. Мне нужно немного SQL, чтобы соответствующим образом обновить порядок мест проведения мероприятия, но мне сложно обойти его, особенно при переходе от разгруппированного к сгруппированному, не оставляя пробелов.

Я бы предположил, что это должно быть в выражении if, как показано ниже, но если подходит более эффективное / СУХОЕ решение, тем лучше:

-- 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

1 Ответ

1 голос
/ 10 ноября 2009
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...