2026년 07월 11일 | DBMS Error 가이드
이 글에서 다루는 내용
42712 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
42712 duplicate alias 는?
PostgreSQL 에러 코드 42712는 duplicate alias 에러로, SQL 쿼리 내에서 동일한 별칭(alias)이 중복으로 사용될 때 발생합니다. 주로 FROM 절이나 서브쿼리, CTE(Common Table Expression), JOIN 구문 등에서 같은 이름의 테이블 또는 서브쿼리 별칭을 두 번 이상 선언했을 때 PostgreSQL이 이를 감지하고 오류를 반환합니다. 이 에러는 쿼리 파싱 단계에서 발생하므로 실제 데이터에 영향을 미치기 전에 차단되며, 수정 방법이 비교적 명확한 편에 속합니다.
주요 발생 원인
1. FROM 절 또는 JOIN 절에서 동일한 테이블 별칭 중복 사용
가장 흔하게 발생하는 원인으로, 하나의 쿼리 블록 내에서 두 개 이상의 테이블이나 서브쿼리에 동일한 별칭을 지정하는 경우입니다. 예를 들어 두 개의 서로 다른 테이블에 모두 t라는 별칭을 사용하면, PostgreSQL은 어떤 t를 참조해야 할지 구분할 수 없기 때문에 즉시 오류를 발생시킵니다. 특히 복잡한 조인 쿼리를 작성할 때 실수로 같은 이름을 반복해서 쓰는 경우가 많습니다.
2. CTE(WITH 절) 내에서의 중복 CTE 이름 선언
WITH 절을 사용하는 CTE 구문에서 동일한 이름의 CTE를 두 번 정의하면 이 에러가 발생합니다. CTE는 하나의 쿼리 실행 범위 내에서 이름으로 구분되기 때문에, 같은 이름을 재사용하는 것은 허용되지 않습니다. 대규모 분석 쿼리를 작성할 때 CTE를 여러 개 선언하다 보면 이름이 겹치는 경우가 생길 수 있으므로 주의가 필요합니다.
3. 서브쿼리 또는 파생 테이블에서의 별칭 중복
FROM 절 안에 중첩된 서브쿼리(파생 테이블)를 여러 개 작성할 때, 각 서브쿼리에 고유한 별칭을 부여하지 않으면 에러가 발생합니다. 외부 쿼리 입장에서 각 파생 테이블은 별칭으로만 식별되므로, 두 개의 서브쿼리가 같은 별칭을 공유하면 PostgreSQL은 참조 대상을 결정할 수 없습니다. 복잡한 리포팅 쿼리나 데이터 변환 쿼리에서 자주 발생하는 패턴입니다.
해결 방법
원인 1 해결: FROM / JOIN 절 별칭 중복 수정
잘못된 예시:
-- 에러 발생: 두 테이블 모두 't' 별칭 사용
SELECT t.name, t.amount
FROM customers t
JOIN orders t ON t.customer_id = t.id; -- 42712 에러 발생
올바른 예시:
-- 각 테이블에 고유한 별칭 부여
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id;
같은 테이블을 셀프 조인(Self Join)할 때도 별칭을 다르게 지정해야 합니다.
-- 셀프 조인 시 서로 다른 별칭 사용
SELECT e.name AS employee_name, m.name AS manager_name
FROM employees e
JOIN employees m ON e.manager_id = m.id;
원인 2 해결: CTE 이름 중복 수정
잘못된 예시:
-- 에러 발생: 'sales_data' CTE 이름 중복 정의
WITH sales_data AS (
SELECT * FROM orders WHERE year = 2023
),
sales_data AS ( -- 42712 에러 발생
SELECT * FROM orders WHERE year = 2024
)
SELECT * FROM sales_data;
올바른 예시:
-- 각 CTE에 고유한 이름 부여
WITH sales_2023 AS (
SELECT * FROM orders WHERE year = 2023
),
sales_2024 AS (
SELECT * FROM orders WHERE year = 2024
)
SELECT
a.total AS total_2023,
b.total AS total_2024
FROM
(SELECT SUM(amount) AS total FROM sales_2023) a,
(SELECT SUM(amount) AS total FROM sales_2024) b;
원인 3 해결: 서브쿼리(파생 테이블) 별칭 중복 수정
잘못된 예시:
-- 에러 발생: 두 서브쿼리 모두 'sub' 별칭 사용
SELECT sub.total, sub.count
FROM (
SELECT SUM(amount) AS total FROM orders WHERE status = 'completed'
) sub,
(
SELECT COUNT(*) AS count FROM orders WHERE status = 'pending'
) sub; -- 42712 에러 발생
올바른 예시:
-- 서브쿼리에 각각 고유한 별칭 부여
SELECT completed.total, pending.count
FROM (
SELECT SUM(amount) AS total FROM orders WHERE status = 'completed'
) completed,
(
SELECT COUNT(*) AS count FROM orders WHERE status = 'pending'
) pending;
또는 CTE 방식으로 가독성 높게 작성할 수도 있습니다.
WITH completed AS (
SELECT SUM(amount) AS total FROM orders WHERE status = 'completed'
),
pending AS (
SELECT COUNT(*) AS count FROM orders WHERE status = 'pending'
)
SELECT
completed.total,
pending.count
FROM completed, pending;
예방 방법
1. 테이블 이니셜 기반 별칭 명명 규칙 수립
팀 전체가 공통으로 사용하는 별칭 명명 규칙을 정의하면 중복 충돌을 사전에 예방할 수 있습니다. 예를 들어 테이블 이름의 첫 글자 또는 첫 두 글자를 별칭으로 사용하되, 충돌이 발생할 경우 c1, c2처럼 숫자를 추가하는 방식을 채택하면 효과적입니다. 이 규칙을 코드 리뷰 체크리스트에 포함시키면 실수를 조기에 차단할 수 있습니다.
-- 명명 규칙 예시: 테이블명 약어 + 역할 구분
SELECT cu.name, ord.amount, prod.product_name
FROM customers cu
JOIN orders ord ON ord.customer_id = cu.id
JOIN products prod ON prod.id = ord.product_id;
2. 복잡한 쿼리는 CTE로 분리하고 이름 목록 관리
복잡한 쿼리를 작성할 때는 CTE를 적극 활용하되, CTE 이름 목록을 쿼리 상단에 주석으로 미리 나열하는 습관을 들이면 중복을 방지할 수 있습니다. 또한 SQL 린터(linter) 또는 정적 분석 도구(예: sqlfluff, pgFormatter)를 CI/CD 파이프라인에 통합하면 코드가 실행되기 전에 별칭 중복 문제를 자동으로 감지할 수 있습니다.
-- 권장: CTE 이름 목록을 상단에 주석으로 명시
-- CTEs: active_users, recent_orders, product_summary
WITH active_users AS (
SELECT id, name FROM users WHERE is_active = true
),
recent_orders AS (
SELECT user_id, SUM(amount) AS total FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY user_id
),
product_summary AS (
SELECT product_id, COUNT(*) AS order_count FROM order_items
GROUP BY product_id
)
SELECT
au.name,
ro.total,
ps.order_count
FROM active_users au
JOIN recent_orders ro ON ro.user_id = au.id
JOIN product_summary ps ON ps.product_id = ro.user_id;
관련 에러
- 42701 (duplicate_column): 같은 쿼리 결과 내에서 컬럼 이름이 중복될 때 발생하는 에러로,
SELECT절에서 동일한 컬럼명을 두 번 사용하거나INSERT대상 컬럼이 중복될 때 나타납니다. - 42P01 (undefined_table): 별칭을 잘못 수정하다가 참조되지 않는 테이블명이나 별칭을 사용했을 때 연쇄적으로 발생할 수 있는 에러입니다.
- 42803 (grouping_error): 복잡한 집계 쿼리에서 별칭 문제와 함께
GROUP BY절의 잘못된 컬럼 참조로 발생할 수 있으며, 42712 수정 후 연달아 마주칠 수 있는 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.