web-dev-qa-db-ja.com

JOIN(SELECT ...)ue ON 1 = 1?

RedshiftでSQLクエリを読んでいますが、最後の部分を理解できません:

...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1

ON 1=1はどういう意味ですか?

19
kee

単純にクロスジョインを行い、最初のテーブルからすべての行を選択し、2番目のテーブルからすべての行を選択し、デカルト積として表示します。

JOIN(LEFT、INNER、RIGHTなど)ステートメントには、通常、「ON ...」条件が必要です。1= 1を入力することは、「1 = 1は常に真で、何も削除しないでください」と言うようなものです。

8
Buddy Yaussy

意図はunconditional_LEFT JOIN_であり、これはdifferent_CROSS JOIN_から、右のテーブル式に一致がない場合でも、左のテーブル式のすべての行が返されます-_CROSS JOIN_は結果からそのような行を削除します。 マニュアルの結合の詳細。

しかしながら:

_1=1_はPostgresでは無意味であり、Amazon Redshiftを含む すべての派生物 です。 trueを使用してください。これは、おそらく boolean タイプを適切にサポートしていない別のRDBMSから引き継がれています。

_... LEFT JOIN (SELECT  ...) ue ON true
_

繰り返しますが、_LEFT JOIN_は、右側にSELECT MIN(modified) FROM userを持つこの特定のサブクエリには意味がありません。これは、集約関数(min())があり、_GROUP BY_句がないSELECTが常に1行を返すためです。このケース(ただし、no rowが見つからない他のケースは除く)は、次のように簡略化できます。

_... CROSS JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
_
25

デカルト結合をエミュレートするために使用されると思います。

クエリから、最も変更されていない値(1つの要素のみになります)が左側のテーブルのすべてのレコードに割り当てられます。

[〜#〜] ps [〜#〜]:左結合はここではあまり役に立ちません。内部結合を使用するだけでなく

4
Sethu Sabarish