简单左连接上的记录加倍问题

时间:2011-05-27 12:35:47

标签: mysql join

我正在运行此查询:

CREATE TABLE
SELECT people.*, Sheet1.department
  FROM people LEFT JOIN Sheet1 ON people.depno = Sheet1.depno

在一组详细说明员工记录的表格中。

目标是创建一个包含所有"人员"数据,加上人类可读的部门名称。简单,对吧?

问题是生成的表中的每条记录看起来都是完全重复的(字面上每个字段都相同),将大约23,000条记录的表转换为大约46,000条记录的表。我说"大致"因为它不是一个完全加倍的 - 大约有一百条记录的差异。

一些细节:"人"表包含15个字段,包括" depno" field,表示部门的整数。

" Sheet1"正如人们所猜测的那样,表是从包含两个字段的导入的xls文件生成的表:共享" depno"和一个新的部门" (后者是与所讨论的depno相对应的冗长的部门名称)。在" Sheet1"中有44条记录。表

提前感谢您对此的任何指示。让我知道您可以从我这里获得的其他信息。


更新:这是我最终使用的代码,来自我对Johan的回复(再次感谢所有参与此活动的人):

CREATE TABLE morebetter 
    SELECT people.*, Sheet1.department FROM people 
    LEFT JOIN Sheet1 ON people.depno = Sheet1.depno 
    GROUP BY id 

2 个答案:

答案 0 :(得分:2)

听起来Sheet1.depno字段不是唯一的吗?

答案 1 :(得分:0)

people.depno并不是唯一的,这就是为什么你要加倍。

SELECT部分更改为

SELECT DISTINCT people.*, Sheet1.department
  FROM people LEFT JOIN Sheet1 ON people.depno = Sheet1.depno

这将消除重复的行。

在MySQL中你也可以写

SELECT people.*, Sheet1.department
FROM people LEFT JOIN Sheet1 ON people.depno = Sheet1.depno
GROUP BY people.depno

哪种方法略有不同。
第一个查询会删除具有重复输出的行,第二个查询会删除具有重复people.depno的记录,即使people.depno未出现在输出中也是如此。

我喜欢第二种形式,因为它明确了你想要消除的副本,而你不需要调整输出。
它的执行时间也略快一些。

<强> ***警告***
group by版本将消除任何双重person.depno它找到,但如果选择中的其他字段不相同,它将只是随机选择一个!
换一种说法。如果select distinct的结果与group by版本不同,那意味着MySQL正在静默地删除非重复行。
这可能是也可能不是你想要的!

为了安全起见,请在您关注的所有字段上执行group by
如果group by位于unique键上,那么从同一个表中包含该唯一键的其他字段毫无意义。