Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中左键连接后的更多行_Mysql_Join - Fatal编程技术网

MySQL中左键连接后的更多行

MySQL中左键连接后的更多行,mysql,join,Mysql,Join,我有两个表,表1包含22780行。现在我将表1与表2(不包含任何重复项)连接起来,得到了23588行 SELECT * FROM Table1 left join Tabelle6 ON CAST(Table1.Customer AS Int) = table2.Customer 为什么我现在有更多的行?我只需要表1中的每一行一次 编辑:发现我的问题,表2确实包含重复项。但是有没有办法只将每一行连接一次并忽略任何进一步的匹配?正如注释所示,最简单的处理方法可能是执行选择DISTINCT以从

我有两个表,表1包含22780行。现在我将表1与表2(不包含任何重复项)连接起来,得到了23588行

SELECT   * FROM Table1
left join Tabelle6 ON CAST(Table1.Customer AS Int) = table2.Customer
为什么我现在有更多的行?我只需要表1中的每一行一次


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

正如注释所示,最简单的处理方法可能是执行
选择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

如评论所示,处理此问题的最简单方法可能是执行
选择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

DISTINCT
e缩小
SELECT*
的范围以仅选择所需字段是否足够?谢谢您的提示!如果我理解正确,这只有在表2包含完整的重复行时才有效,对吗?有了这些信息,我只能说明一种方法,您将不得不做其他所有事情。以Tim的第二个示例为例,将表替换为
SELECT MIN(id)AS id,NeededField FROM Table 2 GROUP BY NeededField
您能提供更多信息使这个问题更接近答案吗?缩小
SELECT*
范围后,是否有足够的信息只选择所需的字段?谢谢您的提示!如果我理解正确,这只有在表2包含完整的重复行时才有效,对吗?有了这些信息,我只能说明一种方法,您将不得不做其他所有事情。以Tim的第二个示例为例,将表替换为
SELECT MIN(id)AS id,NeededField FROM Table 2 GROUP BY NeededField
,您能提供更多信息使这个问题接近可回答的程度吗?看起来很棒。非常感谢。但是,如果表2包含行,这些行在join属性上有重复项,但在其他方面有所不同,那么我仍然会得到多行。有没有办法只从表2中为每个连接属性选择第一个结果?
第一个结果
不是一个定义良好的东西。在这种情况下,您如何定义“第一”?您可以在第二个表的列上汇总并使用
groupby
,但我们需要查看一些具体数据才能给出答案。“定义良好的东西”有了这样的背景信息,
42
将是一个有效的答案。根据第一个选项的意思选择Min(id)或Max(id)。这看起来很好。非常感谢。但是,如果表2包含行,这些行在join属性上有重复项,但在其他方面有所不同,那么我仍然会得到多行。有没有办法只从表2中为每个连接属性选择第一个结果?
第一个结果
不是一个定义良好的东西。在这种情况下,您如何定义“第一”?您可以在第二个表的列上汇总并使用
groupby
,但我们需要查看一些具体数据才能给出答案。“定义良好的东西”有了这样的背景信息,
42
将是一个有效的答案。根据第一个值的含义选择最小值(id)或最大值(id)。