在SQL中使用聚合函数进行内部联接和分组。

时间:2013-10-01 14:02:22

标签: sql-server tsql

我正在尝试从某些条件的2个表中检索数据。当我只使用条件进行内连接时,我得到一个巨大的值(200000数据)。但是当我分组时,我获得的价值非常低(8000数据)。

SELECT Tcg.SK_tID, Tcg.SK_ServiceProviderID
INTO #CHDetails 
FROM #ClientGroup Tcg           
INNER JOIN dbo.Component AS chd ON  chd.SK_PID = Tcg.SK_PID 
                                AND chd.SK_ServiceProviderID = Tcg.SK_ServiceProviderID
                                AND chd.SK_CompID = @CHD
                                AND chd.ReportDate < @ReportDate
GROUP BY Tcg.SK_PID ,Tcg.SK_ServiceProviderID
你能告诉我原因吗?内部联接始终采用公共数据。 #ClientGroup表中的数据大约为70000,而dbo.Component中的数据非常大。当我在逻辑上查询公共PID和服务提供者时,它应该给我等于或小于#ClientGroup的记录。它是如何提供更多的?

当我分组时,我得到8000.但为什么我要在2个表的内连接中进行分组。

4 个答案:

答案 0 :(得分:1)

group by基本上对结果执行不同的操作。你必须这样做的原因可能是因为你在两个表中都有重复。

请参阅此sqlfiddle:http://sqlfiddle.com/#!3/cbdca/2

其中,table1有3行,table2有3行。当它们连接在一起时,它们会返回9行。

答案 1 :(得分:0)

如果联接为您提供的记录多于预期,则意味着您的联接criterea未完成。这种情况的极端情况是笛卡尔联盟。

检查您的加入条件。

答案 2 :(得分:0)

分组将行组合在一起。通常,它是为了生成聚合数据或生成唯一值列表。在您的示例中,#ClientGroup表被组合在一起,并且返回的总行数会缩小。您应该获得的行数少于#ClientGroup中的行数。

答案 3 :(得分:0)

它不会减少行数,因为INNER JOIN不会执行DISTINCT,而INNER JOIN会从两个表中查找所有匹配的数据。

假设您有表A和表B.两者都有列ID。 表A中总共有3行,所有值都是唯一的。值是1,2,3。 表B总共有300行,但只有3个唯一值。值为1,2,3。 (表B每个唯一值有100行)

现在在这个例子中,如果我在表A和表B之间进行INNER JOIN 然后来自A的每一行都将加入表B中的每个匹配行。 所以 表A中的值1将匹配表B中的100行 表A中的值2将匹配表B中的100行 表A中的值3将匹配表B中的100行

所以在进行INNER连接后,我将获得总共300行。

相反,如果表B具有完全不同的值(1,2,3除外),那么INNER JOIN将不会产生任何结果。