如何在不计算第二个表中的双打的情况下建立连接? [复制]
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
【讨论】:
以上是关于如何在不计算第二个表中的双打的情况下建立连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章