Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询:从表中获取有序行_Sql_Postgresql_Sql Order By - Fatal编程技术网

SQL查询:从表中获取有序行

SQL查询:从表中获取有序行,sql,postgresql,sql-order-by,Sql,Postgresql,Sql Order By,以下是表中的一些条目: id r_id a_id p_id 1900 2 9 105 108 3 9 102 9 4 9 106 105 5 9 108 102 是否可以使用SQL查询获得以下输出 1 9 9 0 3 9

以下是表中的一些条目:

id r_id a_id p_id

1900 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的行位于p_id=x的行的下方

我希望这个问题有意义

问候,
马扬克

编辑:
我在找PostgreSql

  • 根项的p_id=0
  • 没有丢失的链接

以下内容改编自一个正在运行的SQL Server 2005解决方案

我做了一些假设

  • 根项目具有
    p\u id=0
  • 没有丢失的链接
SQL语句

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 使用递归查询(PostgreSQL 8.4版或更高版本):


谢谢。但是,我们只需要一个关于性能的建议。获取所有值,然后在内存中对其进行排序会有多好/差?使用EXPLAIN Analysis查看查询是如何执行的以及使用了多少内存。根据您的情况,您可能需要对work_mem的设置进行一些更改。OP编辑了该问题,他正在寻找与postgreSQL数据库兼容的答案。自从你在编辑之前回答,我不会投票,但是请考虑编辑你的答案。“约翰-我从来没有看过PostgreSQL,但是看了这个被接受的答案和我的,你几乎没有注意到任何差异(递归似乎是唯一的一个)。OP应该能够自己解决这个问题。两个答案都可以接受。当我意识到如何使用postgresql实现时,我得到了另一个答案。现在,我只能接受一个答案:)。我同意,但事实是你明确地说它适用于SQL Server,如果你确信它也适用于PSQL,那么你可能希望删除该限制。@Johan,@Mayank-我相信这就是所需要的。OP已经得到了答案,但他可以验证它是否有效。 1 9 9 0 3 9 102 9 5 9 108 102 2 9 105 108 4 9 106 105
;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
/* 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;