调试 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 查询结果中缺少的数据
当您的查询返回缺少行或列的数据时该怎么办。