如何解决简单左联接上的记录加倍问题
| 我正在运行此查询:CREATE TABLE
SELECT people.*,Sheet1.department
FROM people LEFT JOIN Sheet1 ON people.depno = Sheet1.depno
在一组详细记录员工记录的表上。
目标是创建一个包含所有“人”数据以及人类可读的部门名称的新表。简单吧?
问题在于结果表中的每条记录似乎都是完全重复的(实际上每个字段都相同),从而将大约23,000条记录的表变成了大约46,000条记录的表。我说“大约”是因为这并不是精确的加倍-大约有100条记录之间的差异。
一些细节:\“ people \”表包含15个字段,其中包括\“ depno \”字段,它是一个整数,表示部门。
正如您可能会猜到的那样,“ Sheet1 \”表是一个由导入的xls文件生成的表,该文件包含两个字段:共享的“ depno”和新的“ department”(后者是对应的详细部门名称)到相关的Depno)。 \“ Sheet1 \”表中有44条记录。
预先感谢您对此的任何指点。让我知道您还可以从我这里使用哪些其他信息。
更新:这是我最终使用的代码,来自对Johan的回复(再次感谢从事此工作的每个人):
CREATE TABLE morebetter
SELECT people.*,Sheet1.department FROM people
LEFT JOIN Sheet1 ON people.depno = Sheet1.depno
GROUP BY id
解决方法
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
版本将消除它所查找到的任何一个double.depno,但是如果选择中的其他字段不同,则将随机选择一个!
换一种说法。如果select distinct
的结果与group by
版本的结果不同,则表示MySQL默默地删除了非重复行。
这可能不是您想要的!
为了安全起见,请在您关心的所有字段上加上group by
!
如果分组依据位于“ 10”键上,那么将同一表中的其他字段作为唯一键包含进去是毫无意义的。
, 听起来like11ѭ字段不是唯一的吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。