我正在运行此查询:
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
答案 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
键上,那么从同一个表中包含该唯一键的其他字段毫无意义。