使用 INNER JOIN 时得到重复的结果

Posted

技术标签:

【中文标题】使用 INNER JOIN 时得到重复的结果【英文标题】:Getting Duplicate results when using INNER JOIN 【发布时间】:2014-11-24 00:28:56 【问题描述】:

我有 3 张桌子。一个带有用户名,一个带有一堆数据,然后一个通过它们的 ID 将 2 个表链接在一起。当我尝试使用 INNER JOIN 加入 3 时,我得到一堆重复的行。例如,如果数据表只有 2000 行,一旦我尝试使用内连接来连接 3 个表,我会得到一个显示 100,000 行的输出。这是否与我的数据表比我的用户名表具有更多行并且内部连接不能很好地发挥作用有关?是否可以内部连接一个比另一个具有更多行的表?

为清晰而编辑

对于这个数据库,我导入如下所示的数据:

-Names-----------Numbers-----------Item---------------Cost---
John Smith       111-1111          Pencils           100.75  
Joe Stevens      222-2222          Paper             35.34  
Mike Jones       333-3333          Staples           23.86
John Smith       111-1111          Boxes             11.76

如您所见,John Smith 列出了两次,分别用于两个单独的项目。我想对此进行优化,但只需一次迭代即可分离原始数据并将事物放入自己的表中。

  ID---Name---           ID----Numbers            ID---Items------Cost
  1    John Smith        1    111-1111            1    Pencil     100.75
  2    Joe Stevens       2    222-2222            2    Paper      35.34
  3    Mike Jones        3    333-3333            3    Staples    23.86
                                                  4    Boxes      11.76

现在事情已经优化,我仍然需要能够运行一个查询,该查询可以将 John Smith 与铅笔和盒子相匹配。这就是我创建链接表的原因,该表以正确的顺序保存 ID。

          Name.ID           Number.ID        Item.ID
            1                  1                1
            2                  2                2 
            3                  3                3
            1                  1                4

现在,如果我想运行一个重新创建原始数据转储的报告,我将运行一个查询,该查询仅使用内部连接连接 3 个表。但问题是,我得到了大量重复的结果,而不仅仅是简单地输出应有的数据。我得到这样的东西:

-Names-----------Numbers-----------Item---------------Cost---
John Smith       111-1111          Pencils           100.75 
John Smith       111-1111          Pencils           100.75 
John Smith       111-1111          Pencils           100.75  
John Smith       111-1111          Pencils           100.75 
John Smith       111-1111          Pencils           100.75  
Joe Stevens      222-2222          Paper             35.34 
Joe Stevens      222-2222          Paper             35.34
Joe Stevens      222-2222          Paper             35.34
Joe Stevens      222-2222          Paper             35.34 
Mike Jones       333-3333          Staples           23.86
Mike Jones       333-3333          Staples           23.86
Mike Jones       333-3333          Staples           23.86
Mike Jones       333-3333          Staples           23.86
John Smith       111-1111          Boxes             11.76
John Smith       111-1111          Boxes             11.76
John Smith       111-1111          Boxes             11.76
John Smith       111-1111          Boxes             11.76

所需的输出只是:

-Names-----------Numbers-----------Item---------------Cost---
John Smith       111-1111          Pencils           100.75  
Joe Stevens      222-2222          Paper             35.34  
Mike Jones       333-3333          Staples           23.86
John Smith       111-1111          Boxes             11.76

【问题讨论】:

您似乎有一个联结表。联结表旨在允许一个或多个记录与另一个数量的记录相关联,因此两个名称可能有十个数据,每个数据等于 2 x 10 条记录。 嗯,所以你的意思不是将事物联系在一起,而是将它们相乘? 不,我是说每个名称都有效地包含多个数据。 考虑一下,“请选择您喜欢的所有颜色。” 嗯,是的。我有一大块要导入的数据,它在每列中包含许多重复的条目。结果,我将事物分成不同的表,并为每条记录创建一个版本。用户名表中每个名称只有一个版本,以此类推。当我运行查询时,我需要能够在必要时“重新创建”原始数据转储,将重复的用户名与其相应的数据链接起来。这就是我使用连接表的原因。不知道这是否能让事情更清楚,哈哈?对不起 【参考方案1】:

试试这个

Select Distinct t1.Names,t2.Number,t3.Item,t3.Cost
From  
tableName t1  
inner join tableNum t2  
on t1.ID = t2.ID  
inner join tableItem t3  
on t1.ID = t3.ID

【讨论】:

使用 DISTINCT 掩盖数据库设计中的问题不是一个好主意。 这不会在 MS Access 中运行。 @python_newbie 获取重复项时有一些原因,如果您不调查原因而只使用 DISTINCT,您会得到缓慢的查询,并且将来可能会出现主要数据的其他问题。 weblogs.sqlteam.com/markc/archive/2008/11/11/60752.aspx

以上是关于使用 INNER JOIN 时得到重复的结果的主要内容,如果未能解决你的问题,请参考以下文章

mysql的unionleft join right join inner join和视图学习

Transact-SQLSQL Server自动把left join自动转化为inner join以及关联时的数据重复问题

INNER join和OUTER join有啥区别[重复]

Inner Join vs Exists() 同时避免重复行

使用 INNER JOIN 更新 SQL Server 中的多个表 [重复]

INNER JOIN Where 子句 [重复]