2026년 09월 14일 | DBMS Error 가이드
이 글에서 다루는 내용
42712 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
42712 duplicate alias 는?
PostgreSQL 에러 코드 42712는 duplicate alias라는 이름으로, SQL 쿼리 내에서 동일한 별칭(alias)이 중복 사용될 때 발생하는 오류입니다. 주로 FROM 절, WITH 절(CTE), 또는 서브쿼리를 포함한 복잡한 쿼리에서 같은 이름의 별칭을 두 번 이상 정의할 때 PostgreSQL 파서가 이를 감지하고 에러를 반환합니다. 이 에러는 실행 시점이 아니라 쿼리 파싱 단계에서 즉시 발생하므로, 쿼리 작성 단계에서 빠르게 확인하고 수정할 수 있습니다.
주요 발생 원인
- FROM 절에서 동일한 테이블 별칭 중복 사용
가장 흔한 원인은 FROM 절이나 JOIN 절에서 여러 테이블 또는 서브쿼리에 동일한 별칭을 지정하는 경우입니다. 예를 들어, 두 개의 서로 다른 테이블을 조인할 때 실수로 같은 별칭을 사용하면 PostgreSQL은 어떤 테이블을 참조해야 하는지 구분할 수 없어 에러를 발생시킵니다. 이는 복잡한 다중 조인 쿼리를 작성하다 보면 빈번히 발생하는 실수입니다.
- CTE(Common Table Expression) 내에서 중복 이름 정의
WITH 절을 사용하는 CTE에서 동일한 이름의 CTE 블록을 두 번 이상 정의할 때 이 에러가 발생합니다. 특히 대규모 리포팅 쿼리나 재귀 쿼리를 작성할 때, 여러 단계의 CTE를 정의하다 보면 이름이 중복되는 실수를 저지르기 쉽습니다. 이 경우 PostgreSQL은 어떤 CTE 결과를 참조해야 하는지 판단할 수 없어 쿼리 자체를 거부합니다.
- 서브쿼리 또는 인라인 뷰에서 동일한 별칭 사용
FROM 절에 포함된 서브쿼리(인라인 뷰)에 별칭을 지정할 때, 같은 쿼리 스코프 내에서 이미 사용된 별칭과 동일한 이름을 사용하는 경우에도 이 에러가 발생합니다. 특히 ORM(Object-Relational Mapping) 도구나 동적 SQL 생성 로직이 자동으로 별칭을 생성할 때 이런 충돌이 발생하기 쉽고, 직접 눈으로 확인하기 어려운 경우가 많습니다.
해결 방법
원인 1 해결: FROM / JOIN 절의 중복 별칭 수정
에러 발생 쿼리:
-- 에러: orders 와 order_items 모두 'o' 별칭 사용
SELECT o.id, o.total_amount, o.product_name
FROM orders o
JOIN order_items o ON orders.id = o.order_id;
-- ERROR: table name "o" specified more than once (42712)
수정된 쿼리:
-- 각 테이블에 고유한 별칭 부여
SELECT o.id, o.total_amount, oi.product_name
FROM orders o
JOIN order_items oi ON o.id = oi.order_id;
별칭은 테이블 이름의 약어를 의미 있게 사용하는 것이 좋습니다. orders → o, order_items → oi 처럼 구분이 명확한 규칙을 팀 내에서 공유하세요.
원인 2 해결: CTE 중복 이름 수정
에러 발생 쿼리:
-- 에러: 'monthly_sales' CTE가 두 번 정의됨
WITH monthly_sales AS (
SELECT date_trunc('month', sale_date) AS month, SUM(amount) AS total
FROM sales
WHERE region = 'KR'
GROUP BY 1
),
monthly_sales AS (
SELECT date_trunc('month', sale_date) AS month, SUM(amount) AS total
FROM sales
WHERE region = 'US'
GROUP BY 1
)
SELECT * FROM monthly_sales;
-- ERROR: WITH query name "monthly_sales" specified more than once (42712)
수정된 쿼리:
-- 각 CTE에 의미 있는 고유 이름 부여
WITH monthly_sales_kr AS (
SELECT date_trunc('month', sale_date) AS month, SUM(amount) AS total
FROM sales
WHERE region = 'KR'
GROUP BY 1
),
monthly_sales_us AS (
SELECT date_trunc('month', sale_date) AS month, SUM(amount) AS total
FROM sales
WHERE region = 'US'
GROUP BY 1
)
SELECT
kr.month,
kr.total AS kr_total,
us.total AS us_total
FROM monthly_sales_kr kr
JOIN monthly_sales_us us ON kr.month = us.month;
원인 3 해결: 서브쿼리 별칭 충돌 수정
에러 발생 쿼리:
-- 에러: 서브쿼리와 테이블 모두 'u' 별칭 사용
SELECT u.name, u.order_count
FROM users u
JOIN (
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
) u ON u.id = u.user_id;
-- ERROR: table name "u" specified more than once (42712)
수정된 쿼리:
-- 서브쿼리에 명확하고 고유한 별칭 부여
SELECT u.name, order_summary.order_count
FROM users u
JOIN (
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
) order_summary ON u.id = order_summary.user_id;
동적으로 생성되는 쿼리라면 별칭 생성 시 인덱스 번호나 유니크 접두사를 포함하는 로직을 추가하세요.
-- 동적 SQL에서 별칭 충돌을 피하는 패턴 예시
SELECT
main_user.name,
sub_orders.total_count,
sub_payments.total_paid
FROM users main_user
JOIN (
SELECT user_id, COUNT(*) AS total_count FROM orders GROUP BY user_id
) sub_orders ON main_user.id = sub_orders.user_id
JOIN (
SELECT user_id, SUM(amount) AS total_paid FROM payments GROUP BY user_id
) sub_payments ON main_user.id = sub_payments.user_id;
예방 방법
- 팀 내 별칭 명명 규칙(Naming Convention) 수립 및 준수
별칭을 단순히 a, b, t1, t2처럼 의미 없이 사용하기보다는 테이블 이름 기반의 약어 규칙을 팀 전체가 공유하고 문서화해야 합니다. 예를 들어 users → usr, orders → ord, order_items → oi, payments → pay 등의 표준을 만들어 코드 리뷰 시 검사하면 중복 별칭 오류를 예방할 수 있습니다. 특히 ORM이 생성하는 쿼리를 직접 수정하거나 확장할 때는 이 규칙이 더욱 중요합니다.
- 복잡한 쿼리 작성 시 CTE를 적극 활용하고 단계별로 검증하기
복잡한 다중 조인 쿼리를 한 번에 작성하기보다는 CTE를 단계별로 분리하여 작성하고, 각 CTE 단계를 독립적으로 실행해 가며 검증하는 습관을 들이세요. CTE 이름은 그 단계에서 무엇을 계산하는지 명확히 드러내는 이름(active_users, monthly_revenue, top_products 등)을 사용하면 중복 가능성이 자연스럽게 줄어듭니다. 또한 EXPLAIN 명령으로 쿼리 실행 계획을 확인하는 습관도 초기 오류 발견에 도움이 됩니다.
관련 에러
- 42701
duplicate_column: 테이블 생성 또는 서브쿼리 결과에서 동일한 컬럼 이름이 중복될 때 발생합니다. 42712와 유사하게 이름 충돌로 인한 에러입니다. - 42P01
undefined_table: 별칭을 잘못 참조하거나, 존재하지 않는 별칭을 사용했을 때 발생합니다. 별칭 수정 과정에서 오타가 생길 경우 연달아 발생할 수 있습니다. - 42703
undefined_column: 별칭이 변경된 이후 이전 별칭 이름으로 컬럼을 참조할 때 발생하는 에러로, 42712 수정 후 후속으로 만나게 되는 경우가 많습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.