iseeit.jp 情報通信技術

『情報通信技術』に関するスキルのほかに、『情報セキュリティ』に関するスキルも重点テーマです。また、特に今後の『高速モバイル通信』と『インターネット』に注目していきます。

UNION ALL & NOT EXISTS

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 文に指定しているカラムの位置の順番にあたります。

 ⇒ affiliated with
 (2011.08.28 21:00)