Oracle 转 PG- ERROR: recursive query “t“ column 2 has type character varying(150) in non-recursive t

POSTGRESQL中ERROR: recursive query "t" column 2 has type character varying(150) in non-recursive term but type character varying overall

最近在做项目的时候有个需求是需要查到当前登录的用户下辖所有区域的数据,并将查询出来的部门信息以如下格式展示

最高人民法院>江苏省高级人民法院>南通市中级人民法院
最高人民法院>江苏省高级人民法院>连云港市中级人民法院

,于是用如下语句查询

WITH RECURSIVE T AS (
    SELECT
        c_id,
        c_name
    FROM
        db_aty.t_aty_corp
    WHERE
        c_pid IS NULL
    UNION ALL
        SELECT
            D.c_id,
            T.c_name || '>' || D.c_name
        FROM
            db_aty.t_aty_corp D
        JOIN T ON D.c_pid = T .c_id
) SELECT
    c_id AS corpId,
    c_name AS corpName
FROM
    T

但是出现了如下错误

 ERROR:  recursive query "t" column 2 has type character varying(150) in non-recursive term but type character varying overall

根据错误提示猜测这是因为在sql语句中使用union all 时  需要前后查询出的字段属性一致,而在进行查询时,使用t.c_name || '>' || D.c_name 时由于是拼接的字符串 所以字段属性与前面的

c_name不一致,所以导致报错,

解决办法:为拼接后的字符串指定字段格式

WITH RECURSIVE T  AS (
    SELECT
        c_id,
        c_name::varchar(150)
    
    FROM
        db_aty.t_aty_corp
    WHERE
        c_pid is null
    UNION ALL
        SELECT
            D.c_id,
            (T.c_name   || '>' || D.c_name )::varchar(150) as c_name
        FROM
            db_aty.t_aty_corp D
        JOIN T ON D.c_pid = T .c_id
) 
SELECT c_id AS corpId ,c_name as corpName  FROM T

--z
SELECT
    '/' || NAME_PATH || '/' || C.XNAME AS path2
FROM
    (
        WITH RECURSIVE T  AS (
            SELECT
                XOID,XNAME,GXGROUP,GXCORP,
                XNAME::varchar(150) as NAME_PATH
            FROM
                GXGROUPROLE
            WHERE
                XOID = '1004000004K3ZUAZG908'
            UNION ALL
            SELECT
                D.XOID,D.XNAME,D.GXGROUP,D.GXCORP,
                (T.NAME_PATH || '/' || D.XNAME)::varchar(150) as NAME_PATH
            FROM
                GXGROUPROLE D
                    JOIN T ON D.XOID = T .GXGROUP
        )
        SELECT *  FROM T
    ) G
        LEFT JOIN GXCORPORATION C ON G.GXCORP = C.XOID
WHERE
    GXGROUP IS NULL

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值