2013年1月12日土曜日

[MySQL]UNIONでOrder By

特に難しいことはないのだが、良く分からんSQLを見たのでそんなSQLが消えることを願い。

そのSQLは下記のようなもの。
  select *
    from (select id, name from table1
          union
          select id, name from table2
         ) t1
order by 1;
なんでわざわざunionした結果をselectしてorder byするんだろう?と思って、「union order by」でぐぐってみて「Unionの結果全体をOrder By したい。」で同じようなsqlを発見!SQL Serverは知らないのでこうしか書けないのかもしれないけど、自分が見たのはMySQL。MySQLでもこの変なsqlでもちろん動くけど、MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.7.2 UNION 構文を見れば下記のように書くことがわかる。
(select id, name from table1)
 union
(select id, name from table2)
order by id;
↓を注意する必要はあるだろうが、エイリアスを使えば良いだけなので特に難しいことはない。
ORDER BY はテーブル名を含むカラム参照を利用する事ができません。(それは、tbl_name.col_name フォーマット内の名前です。)
なんでもかんでもググるんじゃなくて、マニュアル読めカスと言いたい。