MySQL 공식 홈페이지의 답변을 참조한 결과, Incorrect number of columns from subquery: 라는 답변을 확인할 수 있었다.

SELECT (SELECT column1, column2 FROM t2) FROM t1;

You may use a subquery that returns multiple columns, if the purpose is row comparison. In other contexts, the subquery must be a scalar operand.

그리고 나서, Row SubQuery 에 대해 알아볼 수 있는 해당 문서를 안내해주어 들어가서 알아보았다.

Scalar or column subqueries return a single value or a column of values. A row subquery is a subquery variant that returns a single row and can thus return more than one column value.

행, 혹은 열에 대한 SubQuery 는 단일 값 혹은 값들의 column 들을 반환한다. 행에 대한 SubQuery 는 1개의 row, 그리고 1개 이상의 column value 를 반환할 수 있다고 한다.


에러 직역

"피연산자는 1개 이상의 column 을 가지고 있어야 한다" 라는 의미이다.

내 상황

ORM으로 추상화가 되어있는 상황인지라, 어떤 상황에서 어떤 Query 가 날아가는 지를 몰랐다. 그래서 날아가는 Query 로그를 반환해야겠다는 생각에, 사용하는 TypeORM 의 Connection Options 단락에 들어가, logging property 를 참조해 logging option 을 추가하였다.

				// ...
				write: {
          name: 'write',
          ...devBaseOption,
          port: parseInt(process.env.LOCAL_DB_WRITE_PORT, 10),
          host: process.env.LOCAL_DB_HOST,
          synchronize: true,
          migrationsRun: true,
          logging: true,
        },
				// ...

에러 로그 확인

# query failed: 

SELECT `DrivingKeyword`.`driving_keyword_id` AS `DrivingKeyword_driving_keyword_id`,
`DrivingKeyword`.`category` AS `DrivingKeyword_category`, 
`DrivingKeyword`.`name` AS `DrivingKeyword_name` 
FROM `driving_keyword` `DrivingKeyword` 
WHERE (`DrivingKeyword`.`driving_keyword_id` = ?) 
OR (`DrivingKeyword`.`driving_keyword_id` = ?) 
OR (`DrivingKeyword`.`driving_keyword_id` = ?) 
OR (`DrivingKeyword`.`driving_keyword_id` = ?)
OR (`DrivingKeyword`.`driving_keyword_id` = ?) 

# -- PARAMETERS: [1,4,11,13,[11,13]]

Query 자체는 문제가 없어 보인다. 문제는 Parameter 인데, 배열을 flat 하게 만든다고 해서 만든 것이, 저런 식으로 [1,4,11,13,[11,13]] nested 구조로 이뤄져 있었다.