SQL-запрос: выборка упорядоченных строк из таблицы - II - PullRequest
0 голосов
/ 18 мая 2011

Ниже приведены некоторые записи из таблицы:

id      r_id        a_id        p_id

1       9           9           0
2       9           105         108
3       9           102         9
4       9           106         105
5       9           108         102
6       10           10         0
7       10           15         18
8       10           12         10
9       10           16         15
10      10           18         12

Я ищу SQL-запрос, который выдаст результат:

1       9           9           0
3       9           102         9
5       9           108         102
2       9           105         108
4       9           106         105
6       10           10          0
8       10           12         10
10      10           18         12
7       10           15         18
9       10           16         15

Ну, я задал похожий вопрос здесь , но вопрос не был завершен, и я также получил несколько отличных ответов. Редактирование этого вопроса может сделать ответы неприемлемыми, поэтому я не стал редактировать и добавил это как новый вопрос здесь.

  • Корневой элемент имеет p_id = 0
  • Для одного r_id может быть только один p_id = 0
  • Показанная таблица, для которой нужно выполнить Query, не может быть отсортирована по корню.
  • Я ищу вещи для работы в PostgreSql

EDIT: Идея состоит в том, чтобы отсортировать строки таким образом, чтобы строка с {r_id, p_id} = x была ниже строки с {r_id, a_id} = x.

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Изменение ответа на ваш предыдущий вопрос дает следующее ...

WITH RECURSIVE sub(s_id, s_r_id, s_a_id, s_p_id, row) AS (
    SELECT id, r_id, a_id, p_id, 1 AS row FROM foo WHERE p_id = 0
UNION ALL
    SELECT id, r_id, a_id, p_id, (row + 1)  FROM foo JOIN sub ON s_a_id = p_id AND s_r_id = r_id
)
SELECT * FROM sub ORDER BY s_r_id, row;
1 голос
/ 18 мая 2011

Просто измените ЗАКАЗАТЬ на:

WITH RECURSIVE sub(s_id, s_r_id, s_a_id, s_p_id, row) AS (
    SELECT id, r_id, a_id, p_id, 1 AS row FROM foo WHERE p_id = 0
UNION ALL
    SELECT id, r_id, a_id, p_id, (row + 1)  FROM foo JOIN sub ON s_a_id = p_id
)
SELECT * FROM sub
ORDER BY s_r_id ASC, row ASC
;
...