1

「左外部結合」と「ユニオンオール」の間の最良かつ最速のソリューションは何かを知りたいです。データベースは PostgreSQL です。

UNION ALL を使用したクエリ:

SELECT * FROM element, user WHERE elm_usr_id = usr_id
UNION ALL
SELECT * FROM element WHERE elm_usr_id ISNULL;

LEFT OUTER JOIN を使用したクエリ:

SELECT * FROM element LEFT OUTER JOIN user ON elm_usr_id = usr_id;
4

3 に答える 3

3

2 つのクエリで同じ結果が得られない場合があります。

UNION ALL を使用したクエリは、一致する行と、 の null 値のために一致しない行を返しますelm_usr_id

LEFT JOIN (LEFT OUTER JOIN と同じ) を使用したクエリは、一致する行と、対応する値がないために一致しない行を返します。

これに関して、すべての行が表示されると予想される場合は、LEFT JOIN を使用したクエリの方が安全です。

元の質問に戻りますが、LEFT JOIN を使用したクエリは、インデックスを利用するのに最適です。たとえば、並べ替えられた結果が必要な場合、UNION クエリは最も遅くなります。または、クエリがメイン クエリのサブクエリである場合、UNION はテーブル [要素] インデックスの悪用を防ぎます。したがって、そのようなサブクエリの JOIN または WHERE を実行するのは遅くなります。

于 2012-09-14T09:03:54.707 に答える
1

この特定のシナリオでは、ユニオン全体よりも LEFT OUTER JOIN をお勧めします。

union all では、テーブルを 2 回読み取る必要がありますが、LEFT OUTER JOIN では 1 回だけです。

于 2012-09-14T08:50:06.873 に答える
1

おそらく LEFT JOIN ですが、実行するとクエリ プランが表示されますEXPLAIN ANALYSE SELECT...。elm_usr_id のヌル性に基づいて列を変更する場合は、UNION ALL 形式の方が明確かもしれませんがCASE、LEFT JOIN を使用して列の変更を行うために常に使用できます。

于 2012-09-14T08:51:10.533 に答える