10

次のテーブルがあるとします。

table: followers_arrays

   id   |  array
--------+---------
    1   | {3,4,5}


table: small_profiles

   id   | username |  pic    
--------+----------+-------
    3   |   aaaa   | abcd
    4   |   bbbb   | abcd
    5   |   cccc   | abcd

単純な JOIN を使用して、 small_profilesから入力されたデータを含むfollower_arrayを出力したいと思います。

最初は、次のようなunnest関数を使用しています。

SELECT id, unnest(followers_array) AS elem FROM followers_arrays 

そして、それは正しい結果について私に与えます:

   id   |  elem  
--------+--------
    1   |    3
    1   |    4
    1   |    5

さて、私の理解では、このデータをsmall_profiles ON small_profiles.idキーに次のように結合する必要があります。

SELECT id, unnest(followers_array) AS elem 
FROM followers_arrays 
JOIN small_profiles ON small_profiles.instagram_id = elem

ただし、JOIN 中に次のエラーが発生するため、列elemはまだ作成されていないようです: ERROR: column "elem" does not exist

クエリを再配置するにはどうすればよいですか? ありがとう

4

3 に答える 3

3

サブクエリよりも共通テーブル式を使用することを好みます。

WITH unnested_arr_1 AS (
    SELECT unnest(ARRAY[1, 2, 3]) array_1_item
)
,unnested_arr_2 AS (
    SELECT unnest(ARRAY[2, 3, 4]) array_2_item
)
SELECT  *
FROM    unnested_arr_1 arr1
    FULL OUTER JOIN unnested_arr_2 arr2 ON arr1.array_1_item=arr2.array_2_item

生成:

array_1_item |array_2_item |
-------------|-------------|
1            |[NULL]       |
2            |2            |
3            |3            |
[NULL]       |4            |

ネストされていない配列のみを結合する場合、上記のクエリは次のように簡略化できます。

SELECT * 
FROM   unnest(
    ARRAY[1, 2, 3]
   ,ARRAY[2, 3, 4]
) as U(array_1_item , array_2_item );
于 2017-12-28T15:57:39.657 に答える
0

上記の答えは機能的に正しいです。次のようなものをお勧めします。よりコンパクトでシンプルです。

SELECT f.id, sp.username, sp.pic
FROM followers_arrays fa
     CROSS JOIN unnest(fa.array) f(id)
     JOIN small_profiles sp ON sp.id = f.id;

CTE はクエリ プランナーの障害になる可能性があるため、一般的には使用しないことをお勧めします。このデータセットは非常に小さいため問題にはなりませんが、より大きなデータセットは問題になる可能性があります。また、デカルト行セットを減らすことができない限り、サブクエリを避けるようにしています。

于 2021-11-09T04:02:41.610 に答える