# 42P09 — 表别名不明确

> PostgreSQL SQLSTATE 42P09（ambiguous_alias）的来源与诊断参考。
---

# 42P09 — 表别名不明确

## 速览 {#at-a-glance}

`42P09`（**ambiguous_alias**）是解析阶段的 `ERROR`：一个可见表引用对应多个关系命名空间项。它发生在执行前，并有文本别名和关系 OID 两条路径。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `42P09` |
| 条件名 | `ambiguous_alias` |
| 状态 | `有效` |
| 已知存在于 | `7.4` |
| 锁定快照 | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_AMBIGUOUS_ALIAS` |
| 别名 | `—` |

<!-- source facts: data/errcodes/42P09.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

文本引用由 `scanNameSpaceForRefname` 比较可见命名空间别名，发现第二个可见匹配时报告 `table reference "%s" is ambiguous`。仅列项和非活动 LATERAL 作用域中的 lateral-only 项会被排除。`scanNameSpaceForRelid` 另一条路径按 OID 匹配无别名关系 RTE，同一关系出现多次时报告 `table reference %u is ambiguous`。两条路径都带解析位置，且不同于列歧义。

## 诊断 {#diagnosis}

检查 FROM/JOIN 树、别名、子查询/CTE 可见性和 LATERAL 作用域。若主消息带引号名称，查找重复的可见别名；若带 OID，查找重复的无别名同一关系 RTE。还要检查连接别名是否隐藏内部命名空间，或 LATERAL 子查询是否同时暴露两个别名。`search_path` 可能影响前面的关系查找，但不能作为已存在重复解析项的通用修复。

## 处理 {#response}

给可见关系设置有意义且不同的别名，并通过别名限定引用，或从查询构造器删除多余关系。保留有意的 LATERAL 作用域，修改后核对连接基数。不要把 `42P09` 当作 `42P01`（关系不存在）或 `42702`（列歧义），也不要反复提交相同文本。解析 `ERROR` 若发生在显式事务中，应回滚到保存点或回滚事务再继续。

## 消息变体 {#messages}

选定变体均为 `ERROR`：

| 解析路径 | 主消息 |
| --- | --- |
| 重复的可见别名/名称 | `table reference "%s" is ambiguous` |
| 重复的无别名关系 OID | `table reference %u is ambiguous` |

两者都附带解析位置；`%s` 和 `%u` 是源码中的动态字段。

## 版本 {#versions}

目录范围从 7.4 到 18.6、19beta3，不是精确的功能引入判断。选定的是 18.6 固定文本别名和内部 OID 源码路径，未运行数据库。

## 相关 {#related}

- [`42702`](../42702/)
- [`42P08`](../42p08/)
- [`42P01`](../42p01/)

## 来源 {#sources}
- `src.errcodes.42P09.18.6` — `src/backend/utils/errcodes.txt` line 389，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt#L389)）。

- `src.call.42P09.ed0c1b7f7e4bd90cb2068e17` — `src/backend/parser/parse_relation.c` lines 224-228，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `0d9c88f4a8def4c2d982c33f13208590e21ecf5e6f8cd9d7faa223dc771c9a9a`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/parse_relation.c#L224-L228)）。
- `src.call.42P09.171afa1503a4e198e620e1b5` — `src/backend/parser/parse_relation.c` lines 271-275，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `0d9c88f4a8def4c2d982c33f13208590e21ecf5e6f8cd9d7faa223dc771c9a9a`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/parse_relation.c#L271-L275)）。
- `src.calls.REL_18_6.42P09` — 固定本地核心调用扫描；SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf`。
- [`作者证据`](../../data/evidence/42p09.json) — 记录源码断言、消息角色和运行边界。
