偵錯 SQL 查詢結果中重複的資料
當您的查詢傳回具有重複列或欄的資料時,該怎麼辦。
您的資料在哪裡重複?
重複的列
在開始之前,請先確定您知道來源表格或巢狀查詢的結構描述。
- 您是否遺漏
GROUP BY
子句? -
檢查您的來源表格或巢狀查詢是否有重複的列。您需要針對每個包含重複列的表格或查詢結果重複步驟 3 和 4。
-- If the row_count is greater than 1, -- you have duplicated rows in your results. SELECT < your_columns >, COUNT(*) AS row_count FROM < your_table_or_upstream_query > GROUP BY < your_columns > ORDER BY row_count DESC;
- 檢查您的下方表格,以查看您的聯結類型如何與您的表格關係互動。
- 變更您的聯結類型或減少您的表格關係.
說明
當資料在上游系統或 ETL 工作中重新整理時,列可能會意外重複。
有些表格的列乍看之下看起來像重複項目。這在追蹤狀態變更的表格中很常見(例如,每次狀態變更時新增一列的訂單狀態表格)。狀態表格可能具有看起來完全相同的列,除了列的時間戳記之外。如果您擁有的表格有很多欄,可能很難偵測到,因此請務必執行上述步驟 2,如果您不確定,請詢問您的資料庫管理員。
如果您已撰寫聯結,假設表格的關係為一對一關係,但實際上表格的關係為一對多或多對多關係,則對於「多」表格中的每個相符項目,您都會取得重複的列。
延伸閱讀
聯結類型與表格關係
此表格摘要說明當找到相符的列時,聯結類型如何與表格關係互動以產生重複項目。
A 與 B 為一對一 | A 與 B 為一對多 | A 與 B 為多對多 | |
---|---|---|---|
A INNER JOIN B | 沒有重複的列。 | 沒有重複的列。 | 來自 A 或 B 的重複列。 |
A LEFT JOIN B | 沒有重複的列。 | 可能來自表格 B 的重複項目。 | 來自 A 或 B 的重複列。 |
B LEFT JOIN A | 沒有重複的列。 | 可能來自表格 B 的重複項目。 | 來自 A 或 B 的重複列。 |
A OUTER JOIN B | 沒有重複的列。 | 可能來自表格 B 的重複項目。 | 來自 A 或 B 的重複列。 |
A FULL JOIN B | 沒有重複的列。 | 來自表格 B 的重複列。 | 來自 A 或 B 的重複列。 |
如何減少表格關係
如果您有重複的列,因為您假設了一對一關係,但實際上您的表格是一對多或多對多關係,您可以使用下列方式移除重複項目
- 用於一對多關係的 INNER JOIN。
- 用於一對多或多對多關係的具有彙總函式的 CTE。
例如
-- Assume table_a is a one-to-many with table_b.
-- The query below will duplicate rows from table_b
-- for every matching row in table_a.
SELECT
< your_columns >
FROM
table_a
LEFT JOIN table_b ON key_a = key_b;
選項 1:將 INNER JOIN
與一對多關係搭配使用
-- The query below will get one row from table_b
-- for every matching row in table_a.
SELECT
< your_columns >
FROM
table_a
INNER JOIN table_b ON key_a = key_b;
選項 2:使用 CTE 減少表格關係
-- The query below will get aggregated values from table_b
-- for every matching row in table_a.
WITH table_b_reduced AS (
SELECT
AGGREGATE_FUNCTION (< your_columns >)
FROM
table_b_reduced
GROUP BY
< your_columns >
)
SELECT
< your_columns >
FROM
table_a
JOIN table_b_reduced ON key_a = key_b_reduced;
重複的欄
- 如果您要聯結資料,請檢查您的
SELECT
陳述式是否同時包含主索引鍵和外來索引鍵欄。 - 依照偵錯 SQL 邏輯下的步驟檢查您的欄是否在來源重複。
- 深入瞭解非預期查詢結果的常見原因。
您有不同的問題嗎?
您仍然卡住嗎?
搜尋或詢問 Metabase 社群。
下一步:偵錯 SQL 查詢結果中遺失的資料
當您的查詢傳回遺失列或欄的資料時,該怎麼辦。