代码之家  ›  专栏  ›  技术社区  ›  khex

如何对数组进行UNNEST、GROUP和JOIN?

  •  0
  • khex  · 技术社区  · 7 年前

    不需要 cars.colors 阵列,那么 集团 或者将数组中的所有颜色分组,然后加入它。但它是如此的安静,它是嵌套的 选择

    这是 SQLFiddle

    create table cars (
        cars_id integer,
        name    char(32),
        colors  int []
    );
    
    insert into cars (cars_id, name, colors) values
        (1, 'liftback',  array [1, 2, 3]),
        (2, 'hatchback', array [2, 4, 6]),
        (3, 'sedan',     array [3, 4, 6]),
        (4, 'phaeton',   array [4, 5, 6]);
    
    create table tags (
        tags_id  integer,
        shade    char(16)
    );
    
    insert into tags (tags_id, shade) values
        (1, 'green'), (2, 'blue'),  (3, 'yellow'), (4, 'black'), (5, 'white'), (6, 'red');
    

    但如何插入 array_agg unnest ?

    SELECT
        cars.name,
        array_agg(tags.shade) AS shade_colors
    FROM cars
    LEFT JOIN tags ON cars.cars_id = tags.tags_id
    GROUP BY cars.cars_id;
    
    

    enter image description here

    enter image description here

    这就是我得到的

    enter image description here

    0 回复  |  直到 7 年前
        1
  •  1
  •   Gen Wan Staidly    7 年前

    请尝试以下操作(先取消Nest,然后再执行array_agg):

    select a.name, array_agg(t.shade ) as shade_colors
    from (
    select c.cars_id, c.name, unnest(c.colors) as colorid
    from cars c)a
    left join tags t
    on a.colorid = t.tags_id
    group by a.name
    

    试验结果: SQL<>Fiddle

        2
  •  1
  •   Chris McGraw    7 年前

    你有没有试过用with语句把它撕成碎片?

    with cars_qry as (
    select cars_id, name, unnest(colors) as shade
    from cars
    )
    
    select c.name, array_agg(t.shade) as shade_colors
    from cars_qry as c
    left join tags as t
       on c.cars_id = t.tags_id
    group by c.name
    

    from (select cars_id, name, unnest(colors) as shade from cars) as c