2015-12-11
MariaDB [test]> select * from testbl;
+-----+------+-------+-------+
| idx | int1 | int2  | char1 |
+-----+------+-------+-------+
|   1 |  123 | 00123 | 123   |
|   3 |    2 | 01234 | 123   |
|   4 |    3 | 01234 | 123   |
|   6 |    2 | 01234 | 123   |
+-----+------+-------+-------+
4 rows in set (0.00 sec)

MariaDB [test]> select * from testbl2;
+-----+------+-------+
| idx | int1 | desc  |
+-----+------+-------+
|   1 |    2 | b1ix  |
|   2 |    2 | is    |
|   3 |    2 | best  |
|   4 |    3 | great |
+-----+------+-------+
4 rows in set (0.00 sec)

내가 언제나 즐겨 쓰는 testbl과 이번에 새로 만든 testbl2 테이블이 있다.
위 두테이블을 대상으로 서브쿼리를 사용해볼 생각이다.

MariaDB [test]> select *, (select `desc` from testbl2 a where a.`int1` = b.`int1`) dd from testbl b;
ERROR 1242 (21000): Subquery returns more than 1 row

구문오류는 없이 제대로 한거 같은데 오류가 뜬다. 
Subquery returns more than 1 row : 서브쿼리가 1개 이상 반환됩니다.
그렇다. a.`int1` = b.`int1`의 조건을 만족하는 row가 2개나 있기 때문에 이런 현상이 일어나는 것이다.

이럴때는 아래와 같이 limit 1로 반환되는 쿼리를 강제로 1개로 만들어 버리거나,
조건을 좀더 구체적으로 주어서 1개의 row만 반환되도록 하면 된다.

MariaDB [test]> select *, (select `desc` from testbl2 a where a.`int1` = b.`int1` limit 1) dd from testbl b;
+-----+------+-------+-------+-------+
| idx | int1 | int2  | char1 | dd    |
+-----+------+-------+-------+-------+
|   1 |  123 | 00123 | 123   | NULL  |
|   3 |    2 | 01234 | 123   | b1ix  |
|   4 |    3 | 01234 | 123   | great |
|   6 |    2 | 01234 | 123   | b1ix  |
+-----+------+-------+-------+-------+
4 rows in set (0.00 sec)

MariaDB [test]> select *, (select `desc` from testbl2 a where a.`int1` = b.`int1` and a.`desc` = 'best') dd from testbl b;
+-----+------+-------+-------+------+
| idx | int1 | int2  | char1 | dd   |
+-----+------+-------+-------+------+
|   1 |  123 | 00123 | 123   | NULL |
|   3 |    2 | 01234 | 123   | best |
|   4 |    3 | 01234 | 123   | NULL |
|   6 |    2 | 01234 | 123   | best |
+-----+------+-------+-------+------+
4 rows in set (0.00 sec)