‘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 等)中:

  • JOININNER 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 JOINRIGHT JOIN
  • 仔细阅读需求: “如果不存在则返回 null” 之类的描述是使用外连接的强提示。

掌握这些基础概念与编写复杂逻辑同样重要。你是否也曾在代码中因为“默认行为”假设而出错?欢迎在评论区分享你的经历!

0 浏览
Back to Blog

相关文章

阅读更多 »