에러 코드:
WITH RECURSIVE rec_category AS
(
(SELECT id
FROM category
WHERE id = 2)
UNION ALL
(SELECT t2.id
FROM rec_category AS t1, category AS t2
WHERE t1.id = t2.parent_id)
)
결과:
[2022-05-19 18:43:47] [42S02][1932] Table 'STOREDB.category' doesn't exist in engine
스마트스토어 데이터베이스(STOREDB) 의 카테고리(category) 컬럼에서 상위 카테고리 속성(parent_id) 을 가지고 있어서, 어떤 카테고리가 주어졌을 때, 해당 카테고리와 그 하위 카테고리를 모두 조회하는 쿼리를 작성하려고 했다.
WITH RECURSIVE 라는 구문이 있어서 래퍼런스를 보고 문제 코드와 같이 구현해서 실행시켰다.
category 테이블 DDL :
CREATE TABLE IF NOT EXISTS `category`
(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`parent_id` bigint(20),
`store_id` bigint(20) NOT NULL,
`name` varchar(30) NOT NULL,
`level` int(4) NOT NULL,
`use_yn` char(1) NOT NULL,
`creator_id` varchar(25) NOT NULL,
`modifier_id` varchar(25) NOT NULL,
`created_at` datetime NOT NULL,
`modified_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `index_2` (`store_id`),
KEY `index_3` (`parent_id`)
);
실행 결과 아래와 같은 에러메세지를 출력하면서 제대로 출력이 되지 않았다.
[2022-05-19 18:43:47] [42S02][1932] Table 'STOREDB.category' doesn't exist in engine
이와 관련해 해당 에러코드를 검색해봤는데, 나의 상황과는 비슷한 상황이 아니라고 판단했다.
왜냐하면 SELECT * FROM category
와 같은 다른 쿼리에서는 위의 에러메세지가 발생하지 않기 때문이다.
분명히 STOREDB 라는 데이터베이스에 category 라는 테이블이 있는데 에러메세지가 발생하는지 이해가 되지 않아서 조금 더 명확히 해보자 라는 생각으로 테이블 명 앞에 데이터베이스명을 명시해줬다.
개선 코드 :
WITH RECURSIVE rec_category AS
(
(SELECT id
FROM STOREDB.category
WHERE id = 2)
UNION ALL
(SELECT t2.id
FROM rec_category AS t1, STOREDB.category AS t2
WHERE t1.id = t2.parent_id)
)
SELECT * FROM rec_category;
결과 :
위와 같이 데이터베이스 이름을 명시했더니 에러가 해결되었다.
개선 이전의 코드를 MySQL을 사용하는 지인의 환경에서 실행했을 때에는 에러 메세지가 발생하지 않았는데, 아마도 환경의 문제거나 MariaDB의 문제인 것 같다.
아무튼 해결되어서 다행이다!