【问题标题】:Using unnest to join in Postgres使用 unnest 加入 Postgres
【发布时间】:2022-10-13 00:31:48
【问题描述】:

欣赏这是一个简单的用例,但在 Postgres 中使用数组进行连接有困难。

我有两张桌子:

table: shares

   id            |  likes_id_array  timestamp  share_site
-----------------+-----------------+----------+-----------
    12345_6789   | [xxx, yyy , zzz]|  date1   |  fb
    abcde_wxyz   | [vbd, fka, fhx] |  date2   |  tw


table: likes


   likes_id     | name     |  location    
--------+-------+----------+-----
    xxx         |   aaaa   | nice
    fpg         |   bbbb   | dfpb
    yyy         |   mmmm   | place 
    dhf         |   cccc   | fiwk
    zzz         |   dddd   | here


desired - a result set based on shares.id = 12345_6789:

   likes_id     | name     |  location  |  timestamp    
--------+-------+----------+------------+-----------
    xxx         |   aaaa   | nice       |   date1
    yyy         |   mmmm   | place      |   date1
    zzz         |   dddd   | here       |   date1


第一步是对 likes_id_array 使用 unnest():

SELECT unnest(likes_id_array) as i FROM shares
WHERE id = '12345_6789'

但我不知道如何使用 likes_id 上的 likes 表加入由此产生的结果集。任何帮助将非常感激!

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您可以使用带有喜欢标识符的查询创建CTE,然后使用喜欢表进行常规内部连接

    with like_ids as (
      select
          unnest(likes_id_array) as like_id
      from shares
         where id = '12345_6789'
    ) 
    select
        likes_id,
        name,
        location
    from likes 
       inner join like_ids
    on likes.likes_id = like_ids.like_id
    

    Demo

    【讨论】:

      【解决方案2】:

      您可以使用ANY

      SELECT a.*, b.timestamp FROM likes a JOIN shares b ON a.likes_id = ANY(b.likes_id_array) WHERE id = '12345_6789';
      

      【讨论】:

        【解决方案3】:

        您可以使用子查询或 CTE 执行此操作,但最简单的方法是不在 SELECT 子句中调用 unnest 函数,而是在 FROM 子句中调用 table expression

        SELECT likes.*, shares.timestamp
        FROM shares, unnest(likes_id_array) as arr(likes_id)
        JOIN likes USING (likes_id)
        WHERE shares.id = '12345_6789'
        

        【讨论】:

          【解决方案4】:

          您可以将jsonb_array_elements_text 与(隐式)lateral join 一起使用:

          SELECT
            likes.likes_id,
            likes.name,
            likes.location,
            shares.timestamp
          FROM
            shares,
            jsonb_array_elements_text(shares.likes_id_array) AS share_likes(id),
            likes
          WHERE
            likes.likes_id = share_likes.id AND
            shares.id = '12345_6789';
          

          输出:

          ┌──────────┬──────┬──────────┬─────────────────────┐
          │ likes_id │ name │ location │      timestamp      │
          ├──────────┼──────┼──────────┼─────────────────────┤
          │ xxx      │ aaaa │ nice     │ 2022-10-12 11:32:39 │
          │ yyy      │ mmmm │ place    │ 2022-10-12 11:32:39 │
          │ zzz      │ dddd │ here     │ 2022-10-12 11:32:39 │
          └──────────┴──────┴──────────┴─────────────────────┘
          (3 rows)
          

          【讨论】:

            猜你喜欢
            • 2016-02-01
            • 2021-06-18
            • 2020-09-07
            • 2020-10-21
            • 2020-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-20
            相关资源
            最近更新 更多