‘Table 'test.p' doesn't exist’ — 理解 SQL 别名和默认 JOIN 行为
发布: (2026年4月3日 GMT+8 21:26)
3 分钟阅读
原文: Dev.to
Source: Dev.to
问题概述
在解决 LeetCode #175(合并两张表)时,我遇到了一些意想不到的错误。问题源于 SQL 别名语法的使用错误以及对 JOIN 默认行为的误解。
初始查询及错误
SELECT firstName, lastName, city, state
FROM P Person
JOIN Address A
ON P.personId = A.personId;运行该查询时出现运行时错误:
Table 'test.p' doesn't exist别名语法
在 SQL 中,别名的正确顺序是:
[表名] [别名]- 我写的方式:
FROM P Person - 实际发生的情况: 引擎把
P当作表名,把Person当作别名。由于不存在名为P的表,因而报错。
修正方法: 使用真实的表名后跟别名,例如 FROM Person p。
JOIN 行为
我错误地认为普通的 JOIN 行为等同于 LEFT JOIN。在标准 SQL(MySQL、PostgreSQL 等)中:
JOIN是 INNER JOIN 的简写。- INNER JOIN 只在两张表都有匹配时返回行(交集)。
题目要求在地址缺失时返回 NULL,因此使用 INNER JOIN 会把这些人直接从结果中剔除。
使用 LEFT JOIN 的正确查询
SELECT
p.firstName,
p.lastName,
a.city,
a.state
FROM Person p
LEFT JOIN Address a
ON p.personId = a.personId;- LEFT JOIN 保留左表(
Person)的所有行,对于右表(Address)中缺失的值填入NULL。
关键要点
- 别名顺序很重要: 始终写成
[表] [别名],不要反过来。 - 明确指定 JOIN 类型: 切勿假设默认行为。需要保留某一侧行时,请使用
LEFT JOIN或RIGHT JOIN。 - 仔细阅读需求: “如果不存在则返回 null” 之类的描述是使用外连接的强提示。
掌握这些基础概念与编写复杂逻辑同样重要。你是否也曾在代码中因为“默认行为”假设而出错?欢迎在评论区分享你的经历!