横pgsqlの
- LATERAL何ですか
- SQLは、横方向との計算ステップであります
- LATERAL OUTERは、使用(または制限の定義を)制限するJOIN
- LATERALのいくつかの簡単な例
- 概要
私は、多くの場合、いくつかの栗を使用します
まず、そのシナリオ:
表のコモディティ商品があり、評価フォームの評価があります。商品テーブルと評価フォームは多いです。
1は、バックグラウンドで、私はこの製品の問合せ評価の数ながら、情報のクエリ財をしたいと思います。
私たちはすることによって、これを達成することができます
SELECT グラム。* 、 COUNT(E。 *)としてNUM 商品FROM としてG LEFT評価を登録しようとして e.goods_id =で電子g.id 1 = 1 GROUP BY g.id
基と、左側を接続することによって達成することができるであろう
、また、横達成するために使用することができます
SELECT グラム。* 、 e.num 商品FROM としてG LEFTは(横JOIN SELECT COUNT(ev.id)のように、EV AS評価からNUM ev.goods_id = g.id TRUE ON Eなど)1 = 1
だから、ないそう明らかな利点横そうです。
2、我々は、クエリが情報項目の数よりも大きい検討3
SELECT グラム。* 、 COUNT(E。 *)としてNUM 商品FROM としてG LEFT評価を登録しようとして e.goods_id =で電子g.id COUNT(E。HAVING *)> 3 GROUP BY g.idを
これは見つけることができない、成功しません。
あなたが使用する必要があります。この時間LATERAL
SELECT グラム。* 、 e.num 商品FROM としてG 左側(JOIN SELECT COUNT(ev.id)としてEV AS評価からNUM ev.goods_id = g.idを TRUE ON Eなど)1 = 1 AND NUM> 3
3、その後、再び私たちこれらの商品の問い合わせ情報は、製品情報のゴールドプロファイルのコメントを見つけることを期待して
、この時間がより明らかになるとの横方向の利点を
SELECT グラム。* 、 e.num 商品FROM としてG LEFTは、横方向(JOIN SELECT COUNT(ev.id)としてNUM EVとしての評価FROMを LEFTがu.idにユーザUをJOIN = ev.user_id WHERE ev.goods_id = g.id AND u.grade = 9 )AS E ON TRUE WHERE 1 = 1 AND NUM> 0
LATERAL何ですか
横方向の公式な定義で見てみましょう
LATERALキーワードはFROM内のサブクエリの出現の前に配置することができます。それら項目FROM上記提供することを可能にする基準列(横しない場合は、各サブ問合せは、独立して計算され、したがって、相互参照からの他の項目であることはできません)。
フロント表関数はFROMキーワードも置くことができLATERALに表示されますが、キーワードは、どのような場合でも、オプション機能パラメータはアイテム欄から前方に設けられた量への参照を含めることができません。
LATERAL項目はリストから項目層に現れることができ、またはツリーに表示される登録しよう。後者は、JOINの右の部分で発生した場合、あなたは、JOINの左部分に任意の項目を参照することができます。
エントリが含まれている場合に相互参照の側方に、演算処理FROM:カラム内のアイテムへの相互参照を提供する、またはこれらの項目のコレクションから複数の列を提供する複数の行ごとに、項目は、横の行の行またはセットを使用します列の値が算出されます。彼らはおよそ結果と計算され、通常のライン接続を取得することです。各行またはソーステーブルの列のセットについて、プロセスが繰り返されます。
マニュアルに記載さ:
* FOOからの選択横方向(バーのSELECT * = bar.id SS foo.bar_id);
LATERAL(ここで(参照)または横方向の左テーブル句は関連していてもよい)で
許可されている:
LATERAL(SELECT * FROM WHEREバーバー.ID = foo.bar_id)
SQLは、横方向との計算ステップであります
カラム1、横アソシエーション(参照)FROM句プログレッシブ抽出物またはITEMのJOIN(とも呼ばれるソース・テーブル)レコード(S)(S)
相互参照カラム(複数可)を提供する項目FROMの行ごとに、
または複数の行のセット、列を提供する商品FROM
図2は、上記抽出カラム(複数可)を使用して、相関関係は、アイテムを横句を算出する
使用は、カラムの外部または行の行set'us値を評価することLATERALアイテム。
図3に示すように、横方向の計算行(複数可)は、全ての参加からITEM(S)は、通常計算される結果の行(複数可)は、それらがから計算された行と通常通り接合されている加入。
図4は、1から3サイクルにソーステーブルの枯渇のすべての行まで、始まります。
これは、各列またはセットに対して繰り返される列ソーステーブル(単数または複数)からの行。
LATERAL OUTERは、使用(または制限の定義を)制限するJOIN
計算ステップは、一つのソーステーブルの一方から横配置であるため、それだけOUTERとしてソーステーブル全体端に参加するとき、それは、横WHOLE端内に項目として働くことができません使用することができます。
したがって、唯一の左の右横には参加します。左または右で参加します。これは、全体の終わりにすることはできません。
列ソーステーブル(単数または複数)は、INNERまたは左横の項目に参加しなければならない 他の明確に定義された存在しない組の行からそれぞれ計算するためにどのセットの行のためLATERALアイテム。 このような構築物がこのように、として X RIGHTは、横YがJOIN で構文的に有効な、 それがされ、実際に許可されていないため、基準XにY
LATERALのいくつかの簡単な例
図1は、
LATERALの簡単な例であります
FOO SELECT * FROM、横方向(バーからSELECT * WHERE bar.id = foo.bar_id)SS。
それは、より従来と全く同じ結果を持っているので、これは特に有用ではありません
FOO SELECT * FROM、WHEREバーbar.id = foo.bar_id。
一个LATERAL项可以出现在层项列表FROM
2、
相互参照カラムを接合する行(複数可)を計算する必要があるとき横方向主に有用です。一般的なアプリケーションは、集合を返す関数の引数の値を提供しています。例えば、頂点(ポリゴン)が、多角形の頂点の集合を返すことを想定し、我々が持つテーブルに格納されたポリゴンの近接互いに頂点を識別することができます。
p1.id、p2.id、V1、V2 SELECT ポリゴンP1、ポリゴンP2、FROM LATERAL頂点(p1.poly)V1、 LATERAL頂点(p2.poly)V2 (V1 WHERE < - > V2)< 10 AND p1.idを!= p2.id。
このクエリも書くこともできます
p1.id、p2.id、V1、V2 SELECT CROSS P1ポリゴンから横頂点をJOIN(p1.poly)V1を、 CROSS P2ポリゴン横頂点(p2.poly)V2 JOIN WHERE(V1 < - > V2)< 10およびP1を!.ID = p2.id。
ITEM(S)の左側に関数呼び出し、アプリケーションのサポート機能。あなたが排除を見ることができるようにLATERAL、意味は同じです。
(既に述べたように、横のキーワードが、この例では不要ですが、私たちは、明確にするためにそれを使用しています。)
図3は、
それは、横サブクエリが彼らのために何行を生成しない場合でも、ソース行が結果に表示されるように、多くの場合、LATERALサブクエリに登録しようLEFTに特に便利です。例えば、get_product_names()、製造業者によって作られた製品の名前を返しますが、私たちのテーブル内のいくつかのメーカーには現在の製品を生産しない場合、我々はそれらがこのようであるものを見つけることができます:
m.nameを選択 メーカーから横get_product_names ON(m.id)PNAME JOIN左mは真 PNAMEはNULLです。
クエリは、文全体のクエリとしても可能である横結果
概要
1、横方向は層FROM項目のリストに表示されることがあり、それはまた、いくつかのJOINのツリーに表示することができ、それは、JOINの右側に表示された場合、あなたは、JOINの左部分に任意の項目を参照することができます。
計算ステップは、一つのソーステーブルの一方から横配置であるため、OUTER全体端を登録しようとして、それは、横WHOLE端内に項目として働くことができないときに、ソーステーブル2は、それだけで使用することができます。
図3は、LATERALキーワードが接頭子の中から選択にすることができます。これは、項目が表示されます。(横方向のワードから、各SELECT子どもたちは互いに独立である前に、子供たちが列挙された項目の中から選択を参照することができ、それから相互参照他の項目)することができない。
4、次のようにアイテムからのクロスリファレンスLATERALが演算処理をクエリが含まれている場合:列の各行のクロスリファレンス、あるいはために提供項目FROMからの画像を複数設けます行の列のコレクションへの参照は、横の項目を計算する列または行の列の値のセットを使用します。計算された結果セットを、通常通りに関節問い合わせに添加した。このプロセスは、テーブルの列を供給しますコレクションラインまたは行を繰り返します。
参照
- [LATERAL構文および使用方法の導入はPostgreSQL 9.3は、横方向の支持を追加] https://github.com/digoal/blog/blob/master/201210/20121008_01.md?spm=a2c4e.10696291.0.0.408619a4cXorB6&file=20121008_01.md
[LATERALを] https://www.postgresql.org/docs/devel/queries-table-expressions.html#QUERIES-LATERAL