SQL初心者ですが、備忘録です。
UNIONはオプティマイザで実行計画が2つになるので、あまりよくないと言いますが、例えばステータスの確認で1回実行するだけの時に役に立ちます。あまり考えずに結果セットを合体させたい時はUNIONで十分な気がしています。
例えばこんな感じで似た構造の異なるテーブルからデータを取り、結果をページに反映させたい時、便利です。
select task_id, task_status
from task_schedule_main
UNION
select task_id, task_status
from task_schedule_sub
UNIONは重複排除なので、distinctしているのと同じです。
重複も確認したい時は、UNION ALLを使いましょう。
UNIONをした場合はOracleのROWIDが使えずエラーになりますが、UNION ALLでは使えます。
以下、ChatGPT4oによる記事チェック。
「UNIONはオプティマイザで実行計画が2つになるので、あまりよくない」
→ 必ずしも悪いとは限らない。実行計画が2つになるのは事実だが、最適化されることもある。パフォーマンスが悪くなるかはケースバイケース。「UNIONはdistinctしているのと同じ」
→ 厳密には正しいが、「ソートが発生する可能性がある=コストが高くなることもある」点には触れていない。「UNIONではROWIDが使えずエラーになる」
→ 正確には、UNIONの結果にROWIDを含めようとするとエラーになる。ROWIDは物理行に紐づくため、UNIONで複数テーブルをマージすると意味を持たなくなる。