sql >> データベース >  >> RDS >> PostgreSQL

SQLクエリpostgres9.4からネストされたjsonを作成します

    結果として階層構造を取得するには、階層クエリを作成する必要があります。

    1つのjsonオブジェクトに多くの人を入れたいので、<を使用します。 code> json_agg() 分析的には、1人が複数の車を持つことができるため、1人の人が所有する車をjson配列に配置する必要があります。同じことが車やホイールにも当てはまります。

    select
        json_build_object(
            'persons', json_agg(
                json_build_object(
                    'person_name', p.name,
                    'cars', cars
                )
            )
        ) persons
    from person p
    left join (
        select 
            personid,
            json_agg(
                json_build_object(
                    'carid', c.id,    
                    'type', c.type,
                    'comment', 'nice car', -- this is constant
                    'wheels', wheels
                    )
                ) cars
        from
            car c
            left join (
                select 
                    carid, 
                    json_agg(
                        json_build_object(
                            'which', w.whichone,
                            'serial number', w.serialnumber
                        )
                    ) wheels
                from wheel w
                group by 1
            ) w on c.id = w.carid
        group by personid
    ) c on p.id = c.personid;
    

    (フォーマットされた)結果:

    {
        "persons": [
            {
                "person_name": "Johny",
                "cars": [
                    {
                        "carid": 1,
                        "type": "Toyota",
                        "comment": "nice car",
                        "wheels": [
                            {
                                "which": "front",
                                "serial number": 11
                            },
                            {
                                "which": "back",
                                "serial number": 12
                            }
                        ]
                    },
                    {
                        "carid": 2,
                        "type": "Fiat",
                        "comment": "nice car",
                        "wheels": [
                            {
                                "which": "front",
                                "serial number": 21
                            },
                            {
                                "which": "back",
                                "serial number": 22
                            }
                        ]
                    }
                ]
            },
            {
                "person_name": "Freddy",
                "cars": [
                    {
                        "carid": 3,
                        "type": "Opel",
                        "comment": "nice car",
                        "wheels": [
                            {
                                "which": "front",
                                "serial number": 3
                            }
                        ]
                    }
                ]
            }
        ]
    }
    

    ネストされた派生テーブルに慣れていない場合は、一般的なテーブル式を使用できます。このバリアントは、クエリを最もネストされたオブジェクトから最上位レベルに向かって構築する必要があることを示しています。

    with wheels as (
        select 
            carid, 
            json_agg(
                json_build_object(
                    'which', w.whichone,
                    'serial number', w.serialnumber
                )
            ) wheels
        from wheel w
        group by 1
    ),
    cars as (
        select 
            personid,
            json_agg(
                json_build_object(
                    'carid', c.id,    
                    'type', c.type,
                    'comment', 'nice car', -- this is constant
                    'wheels', wheels
                    )
                ) cars
        from car c
        left join wheels w on c.id = w.carid
        group by c.personid
    )
    select
        json_build_object(
            'persons', json_agg(
                json_build_object(
                    'person_name', p.name,
                    'cars', cars
                )
            )
        ) persons
    from person p
    left join cars c on p.id = c.personid;
    


    1. Magentoテーブルsales_flat_orderフィールドprotect_codeの説明

    2. SQLでパーセント/合計を行う方法は?

    3. MySQL JOIN ON vs USING?

    4. PHPログインクラス