SQL-запрос: выборка упорядоченных строк из таблицы - 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

Можно ли получить следующий вывод, используя SQL-запрос

1       9           9           0
3       9           102         9
5       9           108         102
2       9           105         108
4       9           106         105

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

Надеюсь, вопрос имеет смысл.

С уважением,
Mayank

EDIT:
Я ищу это для PostgreSql

  • Корневой элемент имеет p_id = 0
  • Нет отсутствующих ссылок

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Использовать рекурсивный запрос (PostgreSQL версии 8.4 или новее):

/* test data:
CREATE TABLE foo (id, r_id, a_id, p_id) AS
    SELECT  1,9,9,0
    UNION ALL SELECT 2,9,105,108
    UNION ALL SELECT 3,9,102,9
    UNION ALL SELECT 4,9,106,105
    UNION ALL SELECT 5,9,108,102        
;
*/

-- the query you need:
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 row;
1 голос
/ 18 мая 2011

Следующее адаптировано из рабочего решения SQL Server 2005.

Я сделал несколько предположений

  • Корневой элемент имеет p_id = 0
  • Нет недостающих ссылок

Оператор SQL

;WITH RECURSIVE q AS (
    SELECT  *
            , 1 AS Level
    FROM    ATable 
    WHERE   p_id = 0
    UNION ALL
    SELECT  t.*
            , Level = Level + 1
    FROM    q
            INNER JOIN ATable t ON t.p_id = q.a_id          
)
SELECT  *
FROM    q
ORDER BY
        Level
...