调试 SQL 语法错误
查询返回错误消息时该怎么办。
阅读错误消息不应像解谜一样。本调试指南解释了您如何处理那些难以运行的顽固查询。
调试 SQL 查询
如果您的 SQL 查询包含看起来像 {{ variable }} 的 SQL 变量,请先转到 处理 SQL 变量。
- 转到 SQL 查询中失败的行。
- 检查 SQL 查询中失败的行上的 SQL 语法。
- 如果查询使用了联接、子查询或 CTE,请检查您的 查询逻辑。
- 如果收到非 SQL 查询特有的错误消息,请转到 处理错误消息。
在深入学习高级 SQL 之前需要快速复习吗?请查看我们的SQL 速查表,了解核心命令和语法。它也非常适合与开始进行数据分析的同事分享。
SQL 调试是如何工作的?
- SQL 错误消息会针对查询中无法运行的每一行进行显示。您需要为每一行失败的步骤执行上述操作。
- 如果您对某一行进行了任何更改,请先运行查询以检查问题是否已修复,然后再进行下一步。您可以在查询末尾添加
LIMIT子句以加快处理速度。 - 请注意,SQL 查询不是从上到下运行的,因此您不会按照编写的顺序调试查询行。请遵循错误消息来帮助您找到需要关注的行。
调试 SQL 语法
- 检查 SQL 查询中失败的行上的拼写。
- 检查 SQL 查询中失败的行上是否缺少括号或逗号。
- 删除注释行(以
--或/*开头的行)。 - 检查您的 SQL 方言特有的常见语法错误。
解释
您的数据库需要能够“读取”您的查询才能执行它。
- 正确的拼写会告诉您的数据库准确地“寻找什么”。
- 标点符号会告诉您的数据库“如何”(例如使用什么顺序)查找您的数据。
- 注释不应被读取或执行,但有时尾随的空格或符号可能会意外干扰相邻行的读取和执行。
常见 SQL 参考指南
在开始之前,请打开您正在使用的 SQL 方言的 SQL 参考指南。我们在这里链接了一些最常见的指南:
常见 SQL 语法错误
您的错误消息是什么?
列或表名称“未找到”或“未识别”
如果您的 SQL 查询包含看起来像 {{ variable }} 的 SQL 变量,请先转到 处理 SQL 变量。
步骤
-
查看您 SQL 方言的参考指南的结构部分。
-
您使用的是正确的引号吗?例如
SELECT 'column_name'SELECT "column_name"SELECT `column_name`
-
您使用的是正确的列和表路径吗?例如
FROM table_nameFROM schema_name.table_nameFROM database_name.schema_name.table_name
-
您的列名是保留字吗?例如
在 PostgresSQL 中,“users”是保留关键字.
SELECT users会引发错误。SELECT "users"将正确运行。
-
提示:使用 Metabase 检查列和表名称语法
- 在查询构建器中创建一个问题,使用与您的 SQL 问题相同的列和表。
- 将问题转换为 SQL.
- 查看 Metabase 生成的 SQL 查询如何引用列和表名称。
-
-
查看您查询中列和表名称的数据参考。
解释
您需要确保您正在使用数据库所使用的 SQL 方言的正确语法。
您的查询还需要使用与数据库中原始名称匹配的列和表名称。Metabase 使用显示名称,这些名称可以由您的 Metabase 管理员更新,因此数据参考可能与您的数据库架构不匹配。也有可能列或表在数据库端被重命名,但 Metabase 尚未运行同步来获取更新。
延伸阅读
SQL 函数不存在
如果您的 SQL 查询包含看起来像 {{ variable }} 的 SQL 变量,请先转到 处理 SQL 变量。
步骤
-
查看您希望函数应用于的列的数据类型。
- 您可以使用 Metabase 的数据参考来查看列的字段类型(作为数据类型的代理)。
- 如果您有权访问,您也可以直接查询数据库中的信息架构。
-
查看您 SQL 方言的参考指南的函数部分。
- 确认该函数对您的 SQL 方言存在。
- 查看您的函数接受的数据类型。
-
如果您的列的字段类型与函数的预期数据类型不匹配
- 在您的 SQL 查询中将您的列转换为正确的数据类型。
- 如果您是 Metabase 管理员,您也可以在表元数据页面上转换数据类型。
解释
SQL 函数旨在处理数据库中的特定数据类型。例如,PostgresSQL 中的DATE_TRUNC 函数适用于 Postgres 数据库中具有date、timestamp 和time 类型数据的列。如果您尝试在数据库中具有string 数据类型的列上使用DATE_TRUNC 函数,它将不起作用。
请注意,Metabase 的字段类型与数据库中的数据类型并非一一对应。在这种情况下,字段类型提供了有关列数据类型的足够信息来解决错误。
延伸阅读
如何查找 SQL 查询中的失败行
如果您的 SQL 查询包含看起来像 {{ variable }} 的 SQL 变量,请先转到 处理 SQL 变量。
找到 SQL 查询中的失败行后,请转到 调试 SQL 查询下的步骤。
阅读您的 SQL 错误消息
您的错误消息是否
- 告知您行或字符位置?
- 包含表或列名?如果表或列名在您的查询中出现多次,请减小查询的大小。
- 提及 SQL 子句?
减小 SQL 查询的大小
如果您的查询使用
- 子查询(嵌套查询),请单独运行每个子查询。从内部子查询开始,然后向外工作。
- CTE,请单独运行每个 CTE。从基础 CTE 开始,然后向下查询。
- 指向 Metabase 模型的 SQL 变量,请单独运行每个模型。通过打开变量面板转到模型,或在 Metabase 搜索栏中输入变量中的模型 ID 号。
- 请记住,在尝试隔离问题时,要阅读 SQL 错误消息。有关更多信息,请转到SQL 调试是如何工作的?。
在 SQL 编辑器中工作时的技巧
突出显示 SQL 查询的行以
- 使用
Cmd + Return或Ctrl + Enter运行这些行。 - 使用
Cmd + /或Ctrl + /注释/取消注释这些行。
如何找出要使用哪种 SQL 方言
SQL 方言基于存储您要查询的表的数据库。找出要使用的 SQL 方言后,您可以遵循 调试 SQL 查询下的步骤。
找出您正在查询哪个数据库
- 如果您是 Metabase 管理员,请转到管理设置 > 数据库,然后在引擎列下查找。
- 否则,请询问设置您 Metabase 的人。
您有其他问题吗?
您还卡住了吗?
搜索或咨询 Metabase 社区。