【问题标题】:Inner join returning large numbers of duplicates内部联接返回大量重复项
【发布时间】:2012-06-07 20:08:56
【问题描述】:

我正在使用以下查询将两个表连接在一起:

SELECT SDA.smachIPAddress,
DPP.ScanName,
DPP.pspplMSSeverity,
DPP.PatchMissing,
DPP.ScanDate
FROM patchtest_withsev DPP
INNER JOIN patchtest_withip SDA
ON DPP.ScanName =SDA.ScanName

接收2351行数据

当我在 patchtest_withsev 表中查询所有记录时,它只返回 99,而 patchtest_withip 表只返回 99。

谁能明白为什么这个查询会产生如此大的不匹配?

【问题讨论】:

  • 您能否将部分表放入 SQL fiddle (sqlfiddle.com) 以便更好地了解您的问题?
  • 你认为为什么不匹配?

标签: mysql inner-join


【解决方案1】:

似乎两个表都有几行具有相同的 ScanName 值。

例如:

table1:
f1 | f2
 1 | a
 1 | b
 2 | c
 2 | c

table2:
f1 | f2
 1 | a
 1 | b
 2 | c

table1 INNER JOIN table2 ON table1.f1 = table2.f1 给出:

table1.f1 | table1.f2 | table2.f1 | table2.f2
        1 |         a |         1 |         a
        1 |         a |         1 |         b
        1 |         b |         1 |         a
        1 |         b |         1 |         b
        2 |         c |         2 |         c
        2 |         c |         2 |         c

为避免结果中的行完全重复,请尝试使用DISTINCT

【讨论】:

  • 谢谢。我已经修复了示例,以便DISTINCT 会产生不同的结果。
【解决方案2】:

您在任一表中是否有重复的 ScanName 值?如果是这样,那么 SQL 将为每个匹配返回一行,这会很快增加行数。 (例如,如果第一个表中有 3 行具有给定值,第二个表中有 6 行具有该值,则 SQL 将返回 18 行)。

【讨论】:

    【解决方案3】:

    如果patchtest_withip 中有多个记录符合您从patchtest_withsev 加入的条件,您可能会得到类似的结果。根据您得到的结果,我想说patchtest_withip 中有 23-24 条记录与patchtest_withsev 中的每条记录具有相同的ScanName

    【讨论】:

      【解决方案4】:

      如果每个表中有 99 个条目,假设 scanName 没有唯一值,那么您的结果中可能有 99x99=9801 个条目。

      如果您得到真正的重复,请尝试 SELECT DISTINCT。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 2017-07-01
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多