Реализация SQL в очереди с одним запросом - PullRequest
0 голосов
/ 12 мая 2009

У меня есть таблица SQL, которая выглядит следующим образом:

TABLE QUEUE
    ID
    DATA
    POSITION

Поле POSITION содержит название записи относительно очереди. Итак, это может быть:

  • 0 ни в одной позиции (без очереди).
  • 1 первый в очереди (следующий в очереди).
  • > 1 позиция в очереди.

Мне нужен (MS) SQL-запрос, который переместит очередь на на одну позицию.

Перед запросом:

  • 09, запись данных 09, 0
  • 10, запись данных 10, 1
  • 11, Запись данных 11, 2
  • 12, запись данных 12, 3

После запроса:

  • 09, запись данных 09, 0
  • 10, Запись данных 10, 0
  • 11, Запись данных 11, 1
  • 12, Запись данных 12, 2

Как я могу сделать это за один запрос?

Ответы [ 2 ]

4 голосов
/ 12 мая 2009
UPDATE QUEUE
SET POSITION = POSITION - 1
WHERE POSITION <> 0
1 голос
/ 12 мая 2009

Создайте свою очередь в виде связанного списка:

id  parent

09  00
10  09
11  10
12  11

и запрос такой:

WITH vq (id, position) AS (
     SELECT  id, 1
     FROM    queue
     WHERE   parent = 0
     UNION ALL
     SELECT  id, v.position + 1
     FROM    queue q, vq v
     WHERE   q.parent = v.id
     )
SELECT  *
FROM    vq

Чтобы удалить элемент из очереди, просто обновите его родительский элемент до -1.

Это более эффективно, чем обновление всех позиций всех записей в таблице.

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