PostgreSQL错误:子查询返回的多于一行用作表达式

时间:2018-09-15 12:20:44

标签: json postgresql

我正在编写以下代码:

 select row_to_json(t)

     from (
 select json_agg(A) from (

        select DISCIPLINE.D_ID,DISCIPLINE.D_NAME AS Discipline_Name,

    (
            select json_agg(B) from 
(

            select CATEGORY.C_ID,CATEGORY.C_NAME,

                (
                    select json_agg(C) from 
                    (
                        select SUB_CATEGORY.SC_ID,SUB_CATEGORY.SC_NAME
                        from SUB_CATEGORY 
                        WHERE SUB_CATEGORY .C_ID=CATEGORY.C_ID
                    )C
                ) 
                from CATEGORY
                WHERE CATEGORY.D_ID=DISCIPLINE.D_ID
            )B
        )
        from DISCIPLINE 
    )A
)t  

我收到此错误:

  

错误:用作查询的子查询返回的一行以上

该如何解决?

2 个答案:

答案 0 :(得分:0)

可能是内部子查询返回的行多,因此如果需要,应添加限制1

    select SUB_CATEGORY.SC_ID,SUB_CATEGORY.SC_NAME 
    from SUB_CATEGORY 
    WHERE SUB_CATEGORY .C_ID=CATEGORY.C_ID
    LIMIT 1

如此

    select row_to_json(t)
     from (
      select json_agg(A) from (
       select DISCIPLINE.D_ID,DISCIPLINE.D_NAME AS Discipline_Name, (
        select json_agg(B) from (
         select CATEGORY.C_ID,CATEGORY.C_NAME, (
          select json_agg(C) from (
                select SUB_CATEGORY.SC_ID,SUB_CATEGORY.SC_NAME 
                from SUB_CATEGORY 
                WHERE SUB_CATEGORY .C_ID=CATEGORY.C_ID
                LIMIT 1
          ) C
         ) from CATEGORY WHERE CATEGORY.D_ID=DISCIPLINE.D_ID
        ) B
       ) from DISCIPLINE 
     ) A
    ) t  

答案 1 :(得分:0)

在不知道您的数据的情况下,我猜想您的WHERE a = b子句之一就是问题所在。

如果您正在将一个值与另一个值进行=比较,则必须确保在那里确实只有一个要比较的值。因此,在这种情况下,您必须确保WHERE SUB_CATEGORY .C_ID=CATEGORY.C_IDWHERE CATEGORY.D_ID=DISCIPLINE.D_ID中的第二项确实是一个值。否则,等于比较不知道应该与哪个值进行比较。

如果有多个值:

  • 如果不应该查找错误

  • LIMIT 1是否应该是每次的第一个ID(它们的顺序?否则可能是非常随机的)

  • 使用另一个比较运算符,例如。 G。 IN比较器