SQL では、 UNION ALL & NOT EXISTS がわたしの得意技でした。同じような SQL 結果を得るのに、LEFT JOIN 句がありましたが、LEFT JOIN 句では、DBMS によって結果を得るまでのレスポンススピードが大きく異なることが多かったのに対して、UNION ALL & NOT EXISTS では、DBMS による差異がほとんどありませんでした。
UNION ALL & NOT EXISTS を利用した SQL の例です。
試験情報、試験分類の2つのテーブルを試験分類コードで結合します。試験情報レコードに対する試験分類レコードは0か1存在します。
(SELECT a.ID,a.試験通番,a.試験名称,a.試験名短縮,a.試験記号,a.試験分類コード,a.表示順位,a.無効区分,a.作成日,a.更新日,b.ID,b.試験分類名称,b.試験分類名短縮,b.表示順位,a.試験コメント,a.試験情報1,a.試験情報2,a.試験情報3
FROM 試験情報 a,試験分類 b
WHERE a.試験分類コード=b.試験分類コード AND a.無効区分='0' AND b.無効区分='0')
UNION ALL
(SELECT a.ID,a.試験通番,a.試験名称,a.試験名短縮,a.試験記号,a.試験分類コード,a.表示順位,a.無効区分,a.作成日,a.更新日,0,'','',0,a.試験コメント,a.試験情報1,a.試験情報2,a.試験情報3
FROM 試験情報 a
WHERE a.無効区分='0' AND
NOT EXISTS
(SELECT * FROM 試験分類 b WHERE a.試験分類コード=b.試験分類コード AND b.無効区分='0') )
ORDER BY 14,11,7,1
UNION ALL 以前の SELECT 文では、試験分類コードで結合できる全レコードが対象となり、UNION ALL 以後の SELECT 文では、NOT EXISTS の条件で試験分類コードで結合できない試験情報テーブルのレコードが対象となります。そして、この SQL文の実行結果として、その両方のレコードが得られるというものです。
なお、UNION ALL では、その前後の SELECT 文で出力するカラムの数が一致している必要があります。また、ORDER BY 以降の数字は、それぞれの SELECT 文に指定しているカラムの位置の順番にあたります。