偵錯 SQL 查詢邏輯
當查詢傳回看起來錯誤的資料時,該怎麼辦。
合併資料可能很快就會變得非常複雜 (這可能就是為什麼您耐心地撰寫 SQL 而不是使用友善的查詢產生器)。本偵錯指南說明當查詢傳回非預期的結果時,您可以怎麼做。
偵錯步驟
- 取得查詢中使用之資料來源的結構描述。
- 如果您使用的是資料庫中的表格,請從資料參考取得結構描述。
- 如果您使用的是巢狀查詢,例如子查詢、CTE、已儲存問題或模型,您需要個別執行每個巢狀查詢,並手動檢查結果。
- 我不知道我是否正在使用巢狀查詢.
- 檢閱表格或巢狀查詢的外鍵。
- 是否有多個可能的外鍵?
- 外鍵是否已重新命名或移至另一個結構描述?
- 如果您不確定,請詢問維護結構描述的人員。
- 檢查常見的 SQL 邏輯問題。
非預期查詢結果的常見原因
SQL 邏輯描述您的查詢如何合併來自不同表格或資料來源 (包括暫時表格,例如其他查詢的結果) 的資料。合併資料最常見的方式是聯結和巢狀查詢。
即使您的 SQL 邏輯曾經正常運作,也可能會在下列情況下中斷
- 表格或資料來源已變更。
- 巢狀查詢已變更 (如果您建立在已儲存問題或模型之上)。
- 您的巢狀查詢未如您預期般計算 (如果您是從頭開始撰寫)。
- 您的資料包含邊緣案例,例如空白或
NULL
值。
大多數時候,這些變更是由收集資料的系統或管理資料庫和 BI 工具的可愛人員在最上游導入的。
團隊很難預期此類變更的連鎖反應。修正 SQL 邏輯不僅僅是回應變更,而是更新您的方法以更好地防範未來的更新。
如果您收到紅色錯誤訊息,其中提及 SQL 子句或表格和欄名,則您很可能遇到 SQL 語法問題。請前往偵錯 SQL 語法。
常見的 SQL 邏輯問題
彙總結果 (計數、總和等) 錯誤
- 如果您的彙總是
- 檢查來源表格或查詢的篩選器。
- 您如何處理彙總中的空白或
NULL
列? - 您如何處理無效、已取消或已過期的記錄?詢問您的 Metabase 管理員或資料團隊您可能不知道的業務邏輯。
- 您如何處理彙總中的空白或
- 如果您正在使用
COUNT_DISTINCT
,請檢查它是否與其他彙總函式互動。- 例如,在
COUNT_DISTINCT
之上套用SUM
可能會重複計算唯一值。
- 例如,在
- 如果您正在使用時間序列資料,請檢查您的時區。
- 如果您的資料依排程更新,請詢問您的 Metabase 管理員您的表格是否為最新。
說明
彙總通常是您偵測到由非預期查詢結果的常見原因之一所造成問題的第一個位置。上述步驟將協助您捕捉任何可能扭曲結果的資料邊緣案例。如果您發現許多邊緣案例,並且您預期會重複處理相同的案例,您可能會想要將所有這些邏輯捆綁到模型中,以便輕鬆重複使用。
有時,您可能只需要一雙新的眼睛。如果您無法使用上述步驟找到根本原因,請要求隊友協助您檢查您的數學!
延伸閱讀
如何識別巢狀查詢
如果您的 SQL 包含
-
多個
SELECT
陳述式,您正在使用子查詢。 -
WITH
子句,您正在使用 CTE (通用表格運算式)。 -
看起來像
{{ variable }}
在您的FROM
或WITH
子句中的標記法,您有一個SQL 變數,該變數參考已儲存問題或模型。
如何取得巢狀查詢的結構描述
- 從您的巢狀查詢取得資料範例。
- 對於子查詢或 CTE,個別執行每個
SELECT
區塊並使用LIMIT
子句。 - 對於已儲存問題或模型,從變數面板或將 ID 號碼貼到搜尋列中,前往基礎 Metabase 問題。使用查詢產生器新增列限制,或在 SQL 編輯器中新增
LIMIT
子句。
- 對於子查詢或 CTE,個別執行每個
- 比較範例之間的欄名和值,以檢查外鍵。例如
- 在Metabase 範例資料庫中,
Products
資料表有一個ID
欄位,而Orders
資料表有一個Product ID
欄位。 ID
和Product ID
都包含整數值,而且許多這些值在兩個欄位中都會出現。
- 在Metabase 範例資料庫中,
- 比較您的範例之間的列,以檢查資料表關聯性。例如
Products
資料表的ID
欄位中具有唯一值。Orders
資料表有多個列具有相同的Product ID
。- 從
Products
到Orders
的資料表關聯性是一對多(假設外鍵關聯性有效)。
- 如果您正在使用模型,您可以透過將滑鼠游標停留在欄位名稱上來尋找明確定義的metadata。
- 如果您正在以前人的工作為基礎進行建構,請詢問原始查詢、已儲存問題或模型的建立者。
說明
結構描述描述資料表中的欄位、這些欄位的資料類型,以及不同資料表之間欄位的關聯性。此metadata通常由管理您資料的人員為儲存在您資料庫中的資料表明確定義。
由於巢狀查詢的結果僅暫時儲存,因此關於結果的metadata未在任何地方定義或儲存。相反地,上述步驟將幫助您手動檢查查詢結果。
一旦您有了巢狀查詢的結構描述,您可以按照除錯步驟進行。
延伸閱讀
您有其他問題嗎?
您仍然遇到困難嗎?
搜尋或在Metabase 社群中提問。
下一步:除錯 SQL 查詢結果中的重複資料
當您的查詢傳回具有重複列或欄位的資料時,該怎麼辦。