偵錯 SQL 語法錯誤
當您的查詢傳回錯誤訊息時該怎麼辦。
閱讀錯誤訊息不應該感覺像在解謎。本偵錯指南說明您可以如何處理拒絕執行的頑固查詢。
偵錯 SQL 查詢
如果您的 SQL 查詢包含看起來像 {{ variable }}
的 SQL 變數,請先前往SQL 變數疑難排解。
- 前往 SQL 查詢中失敗的行。
- 檢查 SQL 查詢中失敗行的 SQL 語法。
- 如果查詢使用聯結、子查詢或 CTE,請檢查您的查詢邏輯。
- 如果您收到與 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_name
FROM schema_name.table_name
FROM 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 社群。
下一步:偵錯 SQL 查詢邏輯
當您的查詢傳回看起來不正確的資料時該怎麼辦。