偵錯 SQL 查詢結果中重複的資料

當您的查詢傳回具有重複列或欄的資料時,該怎麼辦。

您的資料在哪裡重複?

重複的列

在開始之前,請先確定您知道來源表格或巢狀查詢的結構描述

  1. 您是否遺漏 GROUP BY 子句?
  2. 檢查您的來源表格或巢狀查詢是否有重複的列。您需要針對每個包含重複列的表格或查詢結果重複步驟 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;
    
  3. 檢查您的下方表格,以查看您的聯結類型如何與您的表格關係互動。
  4. 變更您的聯結類型或減少您的表格關係.

說明

當資料在上游系統或 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 的重複列。

如何減少表格關係

如果您有重複的列,因為您假設了一對一關係,但實際上您的表格是一對多多對多關係,您可以使用下列方式移除重複項目

例如

-- 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;

重複的欄

  1. 如果您要聯結資料,請檢查您的 SELECT 陳述式是否同時包含主索引鍵外來索引鍵欄。
  2. 依照偵錯 SQL 邏輯下的步驟檢查您的欄是否在來源重複。
  3. 深入瞭解非預期查詢結果的常見原因

您有不同的問題嗎?

您仍然卡住嗎?

搜尋或詢問 Metabase 社群

下一步:偵錯 SQL 查詢結果中遺失的資料

當您的查詢傳回遺失列或欄的資料時,該怎麼辦。

下一篇文章