Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
如何在postgresql中用递归查询连接字段值?_Sql_Postgresql_Recursion_Concatenation_Recursive Query - Fatal编程技术网

如何在postgresql中用递归查询连接字段值?

如何在postgresql中用递归查询连接字段值?,sql,postgresql,recursion,concatenation,recursive-query,Sql,Postgresql,Recursion,Concatenation,Recursive Query,我在PostgreSQL数据库中有一个表,它以树的形式包含部分地址,如下所示: Id | Name | ParentId 1 | London | 0 2 | Hallam Street| 1 3 | Bld 26 | 2 4 | Office 5 | 3 Id | Address 1 | London 2 | London, Hallam Street 3 | London, Hallam Street, Bld 26 4 |

我在PostgreSQL数据库中有一个表,它以树的形式包含部分地址,如下所示:

Id | Name         | ParentId
1  | London       | 0
2  | Hallam Street| 1
3  | Bld 26       | 2
4  | Office 5     | 3
Id | Address
1  | London
2  | London, Hallam Street
3  | London, Hallam Street, Bld 26
4  | London, Hallam Street, Bld 26, Office 5
我想做一个查询,返回一个地址,从所有祖先的名字连接起来。我需要这样的结果表:

Id | Name         | ParentId
1  | London       | 0
2  | Hallam Street| 1
3  | Bld 26       | 2
4  | Office 5     | 3
Id | Address
1  | London
2  | London, Hallam Street
3  | London, Hallam Street, Bld 26
4  | London, Hallam Street, Bld 26, Office 5

我想我必须使用递归查询,但我发现的所有示例都使用where子句,因此我必须将where name='Office 5'放在特定行的结果中。但是我需要为初始表的每一行连接一个地址。如何做到这一点?

递归查询的诀窍是需要指定种子查询。这是一个确定根节点的查询,或者确定正在构建的树的下降或上升起点

WHERE子句存在的原因是为了建立seed ID=1或Name=Bld 26。如果您希望根据unioned select中指定的内容来提升或降低每个记录的树,那么您应该放弃WHERE语句,以便所有记录都被播种

虽然,你举的例子。。。您可能希望从种子中ID=1的位置开始,写出子ID和父ID。然后在联合中选择将派生递归表与要从中选择的表联接,并将派生递归表的子表联接到表的父表

比如:

WITH RECURSIVE my_tree AS (
  -- Seed

  SELECT 
      ID as Child, 
      ParentID as Parent, 
      Name,
      Name as Address
  FROM <table>
  WHERE <table>.ID = 1


  UNION

  -- Recursive Term
  SELECT 
    table.id as Child, 
    table.parent_id as Parent, 
    table.name,
    t.address || ', ' || table.name as Address

  FROM my_tree as t 
    INNER JOIN <table> table ON
        t.Child = table.Parent_Id  
)
SELECT Child, Address from my_tree;

我以前没有使用过PostgreSQL,因此您可能需要对语法进行一些修改,但我认为这对于RDBMS来说是非常准确的。

在我个人看来,种子查询周围的括号是无用的,并且容易混淆。此外,字符串文字需要用单引号括起来,在SQL中,双引号不是双引号,双引号用于标识谢谢,@a_horse_和_no_name!我觉得种子周围的妄想症很奇怪。我在网上找到了一个postgresql样本,我想也许它会在意。我使用Teradata,它的语法看起来几乎相同,只是如果每个字段没有在WITH RECURSIVE子句中显式声明,它会引发一个错误。似乎一个常见的误解是union或union all查询需要括号,所以我并不奇怪您会在某个地方在线发现。我不知道这是从哪里来的,老实说,这个例子的种子用双括号括起来。虽然我从未使用过PostgreSQL,但我拒绝相信它要求在任何东西周围加上双括号。我听过太多关于它的好消息了。