【问题标题】:More rows after Left Join in MySQLMySQL左连接后的更多行
【发布时间】:2017-06-07 07:47:46
【问题描述】:

我有两个表,table1 包含 22780 行。现在我将 join table1 与 table2 (不包含任何重复项)分开,得到 23588 行。

SELECT   * FROM Table1
left join Tabelle6 ON CAST(Table1.Customer AS Int) = table2.Customer

为什么我现在得到更多行?我只需要 table1 中的每一行一次。

编辑:发现我的问题,表 2 确实包含重复项。但是有没有办法只加入每行一次并忽略任何进一步的匹配?

【问题讨论】:

  • 缩小SELECT * 以仅选择所需字段后DISTINCT 是否足够?
  • 感谢您的提示!如果我理解正确,这仅在 table2 包含完整的重复行时才有效,对吗?
  • 有了这么多的信息,我只能给出一个方法,你必须做其他的事情。以 Tim 的第二个例子,将 Table 替换为 SELECT MIN(id) AS id, NeededField FROM Table2 GROUP BY NeededField
  • 您能否提供更多信息以使这个问题接近可回答?

标签: mysql join


【解决方案1】:

正如评论所暗示的,处理此问题的最简单方法可能是使用SELECT DISTINCT 从结果集中删除重复项:

SELECT DISTINCT
    t1.col1,
    t1.col2,
    t1.Customer,
    ...
FROM Table1 t1
LEFT JOIN Table2 t2
    ON CAST(t1.Customer AS Int) = t2.Customer

但这里还有另一个选择。我们还可以加入删除重复客户的子查询。这将确保第一个表中的任何记录都不会因匹配到第二个表中的多个记录而重复。

SELECT *
FROM Table1 t1
LEFT JOIN
(
    SELECT DISTINCT Customer
    FROM Table2
) t2
    ON CAST(t1.Customer AS Int) = t2.Customer

【讨论】:

  • 这看起来很棒。谢谢!。但是,如果 table2 包含在 join 属性上有重复但在其他方面不同的行,那么我仍然会得到多行。有没有办法为每个连接属性只选择 table2 中的第一个结果?
  • first result 不是一个定义明确的东西。在这种情况下,您如何定义“第一”?您可以汇总第二张表的列并使用GROUP BY,但我们需要查看一些具体数据才能给出答案。
  • "定义明确的东西" 有了这样的背景信息,42 将是一个有效的答案。根据 First 的意思选择 Min(id) 或 Max(id)。
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2012-03-21
  • 2015-01-16
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多