[解決済み】PostgreSQLのLATERAL JOINとサブクエリの違いは何ですか?
質問
Postgresは、このような機能を備えています。
LATERAL
現在、私はチームのために、非効率的なサブクエリを数多く含む複雑なデータダンプを行っており、全体のクエリに4分以上かかってしまうため、このことについて調べています。
私は、以下のことを理解しています。
LATERAL
のような記事を読んでも、「この人なら大丈夫」と思える。
これ
のHeap Analyticsが、まだよくわからないのです。
のユースケースは何ですか?
LATERAL
を結合してください。の違いは何ですか?
LATERAL
joinとsubqueryの違いは何ですか?
どのように解決するのですか?
何
は
a
LATERAL
に参加しますか?
この機能はPostgreSQL 9.3から導入されました。 マニュアル :
に登場するサブクエリ。
FROM
は、キーワードを前にしてLATERAL
. これによって、先行するFROM
の項目があります。(ただしLATERAL
各サブクエリが評価されます。 は独立しているので、他のFROM
の項目があります)。に登場するテーブル関数
FROM
は、その前にキー 単語LATERAL
しかし、関数の場合、キーワードはオプションです。 関数の引数には、以下の方法で提供されるカラムへの参照を含めることができます。 前のFROM
の項目は、どのような場合でも
基本的なコード例はそこに記載されています。
どちらかというと 相関 サブクエリ
A
LATERAL
の結合は、どちらかというと
相関サブクエリ
の右側にある式は、通常のサブクエリではなく、サブクエリになります。
LATERAL
は、その左側の行ごとに1回ずつ評価されます。
相関
サブクエリ - 通常のサブクエリ (テーブル式) は、次のように評価されます。
一度だけ
のみです。(クエリプランナーには、どちらに対してもパフォーマンスを最適化する方法がありますが)。
同じ問題を解決するために、両者を並べたコード例で関連回答。
を返す場合
複数のカラム
, a
LATERAL
の結合は、通常、よりシンプルでクリーンかつ高速です。
また、相関サブクエリに相当するのは、次のようなものであることを覚えておいてください。
LEFT JOIN LATERAL ... ON true
:
サブクエリでできないこと
そこで
は
を使用することができます。
LATERAL
joinはできますが、(相関)サブクエリは(簡単には)できません。相関サブクエリは単一の値のみを返すことができ、複数列や複数行を返すことはできません。ただし、素の関数呼び出し(複数行を返す場合は結果行を乗算します)は例外です。しかし、ある種の集合を返す関数でさえも、その関数が使用できるのは
FROM
節があります。例えば
unnest()
は、Postgres 9.4以降では、複数のパラメータを持つ。
マニュアルです。
にのみ許される。
FROM
節があります。
つまり、これは動作しますが、サブクエリに(簡単に)置き換えることはできません。
CREATE TABLE tbl (a1 int[], a2 int[]);
SELECT * FROM tbl, unnest(a1, a2) u(elem1, elem2); -- implicit LATERAL
カンマ(
,
) の中にある
FROM
は短い表記で
CROSS JOIN
.
LATERAL
はテーブル関数の場合、自動的に仮定されます。
の特殊なケースについて
UNNEST( array_expression [, ... ] )
:
でのセットリターン関数
SELECT
リスト
のようなセットを返す関数も使用できます。
unnest()
の中で
SELECT
のリストを直接表示します。以前は、このような関数が1つ以上あると、驚くような挙動を示しました。
SELECT
リストが表示されます。
しかし、Postgres 10でようやくサニタイズされました。
であり、現在では有効な代替手段となっています(標準SQLではないにせよ)。ご覧ください。
上の例の積み重ね。
SELECT *, unnest(a1) AS elem1, unnest(a2) AS elem2
FROM tbl;
比較する。
dbfiddle - pg 9.6用
これ
pg10用dbfiddle
これ
誤報を明らかにする
については
INNER
とOUTER
の場合、ジョインコンディションは のいずれか、すなわちNATURAL
,ON
join_condition , またはUSING
( join_column [, ...]). 意味は以下をご覧ください。
についてCROSS JOIN
という文言があり、これらの文言はいずれも出現しない。
ですから、この2つの問い合わせは(特に有用ではないにせよ)有効です。
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t ON TRUE;
SELECT *
FROM tbl t, LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
こちらはそうでないのに対して
<ストライク
<ストライク
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
だからこそ
アンドマール
のコード例は正しいです。
CROSS JOIN
は結合条件を必要としない)と
アッティラズ
<ストライク
でございます
はなかった。
関連
-
[解決済み】SQL ServerでIdentityカラムを更新する方法は?
-
[解決済み】SQL Serverは「集約関数やサブクエリを含む式に対して集約関数を実行できない」が、Sybaseはできる。
-
[解決済み] "このSqlTransactionは完了しました。もう使用できません。"...設定エラー?
-
[解決済み] SQLです。最初の出現箇所のみを返す
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] textとvarcharの違い(character varying)
-
[解決済み] PostgreSQLで更新+結合を行うには?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】JOINとUNIONの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Postgresのエラー。式として使用されるサブクエリによって返される複数の行
-
[解決済み】集約関数のないTSQLピボット
-
[解決済み】SQLが単一グループのグループ関数でないこと
-
[解決済み】テキストが切り捨てられた、または1つ以上の文字がターゲットコードページで一致しない アンピボットの主キーを含む
-
[解決済み] SQL Server サブクエリが 1 つ以上の値を返しました。これは、サブクエリが =, !=, <, <= , >, >= のように続く場合は許可されません。
-
[解決済み] SELECT DISTINCTを指定した場合、ORDER BY項目は必ず選択リストに表示されます。
-
[解決済み] Oracle(LiveSQL)のSQL [重複]について
-
[解決済み] 検索エラー ORA-00932: 不整合なデータ型: 期待された DATE は NUMBER になりました。
-
[解決済み] SQLです。最初の出現箇所のみを返す
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?