2014-04-07
참.. 기초적인 오류인데도.. 가끔 10~20분씩 시간을 잡아먹을때가 있다. 그것도 월요일 아침 같은 제정신이 아닐때는... 더 심하기도 하는데... 잡설은 이정도로만 해놓고, 이 포스팅의 결론을 말하자면,

union을 쓸때 order by절에는 select 된 column으로만 가능하다.

라는 건데... msyql 메뉴얼에서는 column뿐만 아니라 alias도 마찬가지이며, 본래의 column명으로는 사용 할 수 없다고 한다.

이런 종류의 ORDER BY는 테이블 이름을 포함하는 컬럼 참조들을 사용하지 않는다. (즉, tbl_name.col_name 포맷으로 명명한다) 대신, 첫 SELECT 문에서 컬럼 alias를 제공하고ORDER BY에서 그 alias를 참조 한다. (대안적으로 그 컬럼 위치를 이용하는 ORDER BY안에서 컬럼을 참조 한다. 그러나 컬럼 위치의 사용은 반대 된다.)
또한 저장 되는 컬럼이 alias라면, ORDER BY 절은 컬럼 이름이 아닌 그 alias를 참조 해야 한다. 

위가 mysql메뉴얼에 나와 있는 말이다.
참조 http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=21523&cat1=13&cat2=380&cat3=401&lang=k
 
그리고 실제 한가지 예를 직접 보자면, 아래와 같다. 

mysql> select * from testbl;
+-----+--------+------+
| sid | id     | name |
+-----+--------+------+
|   1 | black  | hong |
|   2 | white1 | kim  |
|   3 | white2 | ha   |
|   4 | white3 | yan  |
+-----+--------+------+
4 rows in set (0.00 sec)

mysql> select * from testbl2;
+-----+--------+------+
| sid | id     | name |
+-----+--------+------+
|   1 | green1 | park |
|   2 | green2 | cho  |
|   3 | green3 | long |
+-----+--------+------+
3 rows in set (0.00 sec)

mysql> (select id from testbl) union (select id from testbl2) order by sid;
ERROR 1054 (42S22): Unknown column 'sid' in 'order clause'
mysql> (select id from testbl) union (select id from testbl2) order by id;
+--------+
| id     |
+--------+
| black  |
| green1 |
| green2 |
| green3 |
| white1 |
| white2 |
| white3 |
+--------+
7 rows in set (0.00 sec)

위의 예에서 보다시피 sid 라는 column은 해당 테이블에 모두 속해 있지만, union 시에는 뽑아오지 않기 때문에 해당 column으로 order by를 할려고 하면 알수없는 컬럼이라는 에러가 뜨게 된다.