2

約 5 分前まで、配列でもある VARCHAR 型を取得することさえ知りませんでした。これらのテーブルを結合するにはどうすればよいですか:

PEOPLE
ID | PERSON | GROUPS
1  | John   | {ONE,TWO}
2  | Jack   | {TWO}
3  | Jill   | {ONE,TWO,THREE}
4  | Jim    | {TWO,THREE}

GROUPS
ID    | TITLE
ONE   | First
TWO   | Second
THREE | Third

私はこのようなもので終わりたいと思います:

ID | PERSON | GROUP
1  | John   | ONE
1  | John   | TWO
2  | Jack   | TWO
3  | Jill   | ONE
3  | Jill   | TWO
3  | Jill   | THREE
4  | Jim    | TWO
4  | Jim    | THREE

1 回のクエリでこれを正しく行うにはどうすればよいでしょうか。

4

2 に答える 2

6

unnestここでは不要です。配列メンバーシップのテストで単純な結合を使用できます。

SELECT people."ID", people."PERSON", groups."ID"
FROM people
INNER JOIN groups ON groups."ID" = ANY (people."GROUPS")
ORDER BY people."ID", groups."ID";

参照: http://sqlfiddle.com/#!12/5fa34/7

(奇妙な大文字は、SQLFiddle の一貫性のない識別子の引用を修正するのが面倒だったためです。列名は引用されますが、テーブル名は引用されません。)

GIN インデックスを使用してpeople.GROUPS、インデックス付き結合を取得することもできます。GIN インデックスは、作成するのに費用がかかり、更新するのに費用がかかるため、本当に必要な場合にのみ行う必要がありますが、便利です。配列インデックスのマニュアルを参照してください。例えば:

CREATE INDEX people_groups_gin_idx ON people USING GIN("GROUPS");

SELECT people."ID", people."PERSON", groups."ID"
FROM people
INNER JOIN groups ON ARRAY[groups."ID"] @> people."GROUPS"
ORDER BY people."ID", groups."ID";
于 2013-06-12T12:46:40.980 に答える