Postgres,如何限制从联接表返回的行数

问题描述

我有以下查询返回所需的数据,但是对于联接表,我想限制返回的行数,并且最好能够为每个联接表指定。 我尝试将limit与select本身结合使用,但似乎不受支持

这可能吗?我正在使用Postgres 11。

select array_to_json(array_agg(t)) from (
        select 
        tbl_327.field_43,tbl_327.field_1,tbl_327.field_2,jsonb_agg(distinct jsonb_build_object('id',tbl_332.id,'data',tbl_332.fullname)) as field_7,tbl_312.id,tbl_312.fullname)) as field_33
        from schema_1.tbl_327 tbl_327
        left join schema_1.tbl_327_to_tbl_332_field_7 field_7 on field_7.tbl_327_id=tbl_327.id
            left join schema_1.tbl_332_customid tbl_332 on tbl_332.id = field_7.tbl_332_id
            left join schema_1.tbl_327_to_tbl_312_field_33 field_33 on field_33.tbl_327_id=tbl_327.id
            left join schema_1.tbl_312_customid tbl_312 on tbl_312.id = field_33.tbl_312_id
            group by tbl_327.field_43,tbl_327.field_2
        ) t

已更新 这是我的新查询。我简化了它,但是问题是它不再返回正确的数据。对于field_4字段,它正在重播与记录无关的行/数据。我有什么问题吗?

select array_to_json(array_agg(t)) from (
    select 
    tbl_342.field_1,tbl_342.field_2,tbl_342.id,tbl_312.fullname)) as field_4
    from schema_1.tbl_342 tbl_342
    left join lateral (
            select distinct field_4.*
            from  schema_1.tbl_342_to_tbl_312_field_4 field_4
            where field_4.tbl_342_id=tbl_342.id
            limit 50) field_4 on true
            
            left join lateral (
                select distinct tbl_312.*
                from schema_1.tbl_312_customid tbl_312
                where tbl_312_id = field_4.tbl_312_id
                limit 5
            ) tbl_312 on true

    group by tbl_342.field_1,tbl_342.id
    ) t

解决方法

一种方法是将每个left join变成横向联接;然后可以在每个子查询中设置限制:

select array_to_json(array_agg(t)) from (
    select 
        tbl_327.field_43,tbl_327.field_1,tbl_327.field_2,jsonb_agg(distinct jsonb_build_object('id',tbl_332.id,'data',tbl_332.fullname)) as field_7,tbl_312.id,tbl_312.fullname)) as field_33
    from schema_1.tbl_327 tbl_327
    left join lateral (
        select field_7.*
        from schema_1.tbl_327_to_tbl_332_field_7 field_7 
        where field_7.tbl_327_id=tbl_327.id
        order by ...
        limit 5
    ) field_7 on true
    left join lateral (
        select tbl_332.*
        from schema_1.tbl_332_customid tbl_332 
        where tbl_332.id = field_7.tbl_332_id
        order by ??
        limit 5
    ) tbl_332 on true
    left join lateral ...
    group by tbl_327.field_43,tbl_327.field_2
) t

请注意,您需要使用order bylimit才能获得稳定的结果-您可以将查询中的问号替换为新的列或一组列。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...