内部连接和分组依据

Posted

技术标签:

【中文标题】内部连接和分组依据【英文标题】:inner join and group by 【发布时间】:2012-09-01 16:34:06 【问题描述】:

我有两个定义相同的表。

T1:
Name VARCHAR(50)
Qty  INT

T2:
Name VARCHAR(50)
Qty  INT

这是每个表的数据:

T1:
Name   Qty
a   1
b   2
c   3
d   4

T2:
Name   Qty
a   1
b   3
e   5
f   10

我希望得到可以根据名称对两个表中的数量求和的结果。

预期结果集:

Name    TotalQty
a             2
b             5
c             3
d             4
e             5
f            10

如果我做左连接或右连接,它不会从任何一个表中返回我的名称。

我的想法是创建一个临时表并添加这些记录,然后在 Qty 列上进行 SUM 聚合,但我认为应该有更好的方法来做到这一点。

这就是我的查询的样子,它没有返回预期的结果集:

SELECT t1.Name, ISNULL(SUM(t1.Qty + t2.Qty),0) TotalQty
FROM t1
LEFT JOIN t2
ON t1.Name = T2.Name
GROUP BY t1.Name

有人可以告诉我在这里创建临时表是否可行,或者有更好的方法吗?

【问题讨论】:

一个名字可以在t1或t2中有多个记录吗? 没有。该列上有一个唯一索引。 【参考方案1】:

您可以使用UNION ALL 将两个表选为一个,因为它们具有相同的定义。从那里,您可以将它们嵌套为派生表,然后在其上嵌套SUM

SELECT [Name], SUM(Qty) AS TotalQty
FROM (
    SELECT [Name], Qty
    FROM t1
    UNION ALL
    SELECT [Name], Qty
    FROM t2
) YourDerivedTable
GROUP BY [Name]

【讨论】:

@Asdfg - 应该!已编辑【参考方案2】:

您可以使用完全外连接:

SELECT
    ISNULL(t1.Name, t2.Name) AS Name,
    ISNULL(t1.Qty, 0) + ISNULL(t2.Qty, 0) AS TotalQty
FROM t1
FULL JOIN t2 ON t1.Name = T2.Name

在线查看:sqlfiddle

【讨论】:

如果我们在 t1 或 t2 中有多个记录作为一个名称,它不会给出正确的结果。我认为我们应该按名称分组,而不仅仅是 t1.name 它应该是 coalesce(t1.name,t2.name) +1;很喜欢,干净多了出于某种原因,我总是忘记FULL JOINs。 @NitinMidha:Asdfg 已声明 in a comment t1 或 t2 中不能有多个记录作为名称,因为存在唯一索引。

以上是关于内部连接和分组依据的主要内容,如果未能解决你的问题,请参考以下文章

具有内部联接、多个分组依据和最小最大值的 Linq 查询

mysql 使用内部连接优化查询,其中和排序依据和坐标

如何将mysql内部连接结果从行分组到列

如何基于 ManyToManyField 内部连接表并按参数分组并在 Django 中获取最新的表?

如何通过不同级别的枢轴聚合然后在pyspark中进行内部连接?

Laravel Eloquent 查询,带有连接、计数和分组依据