1

我正在转换一些 SQLServer 存储过程,但我遇到了一个无法解决的问题。那是 SQLServer 函数:

CREATE FUNCTION [dbo].[getViewNodeHierarchyAux](@pivot varchar(255), @parents varchar(max))
RETURNS @view TABLE (PARENT_OID varchar(255), CHILD_OID varchar(255))
...
insert into @view select F.* from BTREENODES_NODEHIERARCHY T cross apply [dbo].getViewNodeHierarchyAux(T.CHILD_OID,@parents) F where T.PARENT_OID=@pivot;

这就是我在 PostgreSQL 中想到的转换:

CREATE OR REPLACE FUNCTION getviewnodehierarchyauxprueba(IN pivot character varying, IN parents character varying)
...
  RETURNS TABLE(test_parent_oid character varying, test_child_oid character varying)
return query (select F.* from BTREENODES_NODEHIERARCHY T cross join getviewnodehierarchyprueba(T.CHILD_OID,parents) F WHERE T.PARENT_OID=pivot);

PgAdmin 告诉我在 'from' 子句中没有对表 't' 的有效引用。如果我这样写 getviewnodehierarchyprueba((select CHILD_OID from BTREENODES_NODEHIERARCHY),parents)

它返回多条记录并且不起作用。有任何想法吗?谢谢你!

4

1 回答 1

2

PostgreSQL 不允许使用连接关系的值作为连接中第二个关系的参数。它将在 9.3 中提供 LATERAL 子选择。这是第一个问题。第二个问题 - 子选择只能返回一行

(select CHILD_OID from BTREENODES_NODEHIERARCHY)

可能返回不止一行

您无需等待 9.3 - 使用 CTE(通用表表达式)来处理一些递归数据。

于 2012-12-10T11:22:30.187 回答