如何在不计算第二个表中的双打的情况下建立连接? [复制]

Posted

技术标签:

【中文标题】如何在不计算第二个表中的双打的情况下建立连接? [复制]【英文标题】:How can I build a join without counting doubles in the second table? [duplicate] 【发布时间】:2020-06-07 17:43:01 【问题描述】:

我有 2 个表,我正在尝试构建一个查询,但我没有正确的结果,有人可以帮我吗?

表一:

code|name
74|Jhon
06|Sara
92|Fred
75|Fred
06|Sara
13|Lola

表 2:

code|amount|folder
06|500|1
74|135|0
13|150|0
13|100|1
92|200|1
75|250|0
06|300|1

我想按名称选择文件夹的数量和总数以及文件夹数量为0。

我做了以下查询:

select table1.name,
sum(table2.amount) as amount_tot,
count(table2.folder) as nb_folder,
sum(table2.folder) as nb_folder_ko
from table1 inner join table2 on table1.code=table2.code
group by name

我有以下结果:

name|amount_tot|nb_folder|nb_folder_ko
Lola|250|2|1
Fred|450|2|1
Sara|1600|4|4
Jhon|135|1|0

如您所见,我的源表不正确,我认为我的查询做了一些重复计算,但我不知道如何解决它,请帮助我:)

【问题讨论】:

您能在“预期”输出中进行编辑吗?所以我们确切地知道您想要达到的目标是什么? 为什么第一个表中有重复的条目? 这涉及一个常见错误,人们想要一些连接,每个可能涉及不同的键,一些子查询,每个可能涉及连接和/或聚合,但他们错误地尝试完成所有连接然后全部聚合或聚合以前的聚合。在适当的行上编写单独的聚合和/或聚合一个案例语句选择行;加入一个独特的列集。有时 DISTINCT 聚合在非键连接后选择正确的值。 (对 2 个输入表中任一个的非键的连接可以为每个表的每个键提供多行。) 在考虑发布之前,请阅读您的教科书和/或手册并在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,无论是否包含您的特定字符串/名称和站点:***.com & 标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 【参考方案1】:

你得到一个多对多连接(而不是一对多)。在加入前应用 DISTINCT:

select table1.name,
sum(table2.amount) as amount_tot,
count(table2.folder) as nb_folder,
sum(table2.folder) as nb_folder_ko
from 
 ( 
   select distinct name, code 
   from table1
 ) as table1 
inner join table2 
on table1.code=table2.code
group by name

如果名称/代码组合不是唯一的,则切换到

   select max(name), code 
   from table1
   group by code 

【讨论】:

以上是关于如何在不计算第二个表中的双打的情况下建立连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不指定列名的情况下从另一个表更新一个表?

Laravel 连接 2 个表,第一个表中的一个数据和第二个表中的多行

Oracle - 使用第二个表中的行更新第一个表中的数据

左外连接 - 如何在第二个表中返回一个布尔值?

如果第二个表不存在连接,Mysql 使用一个表中的列值

Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列