1

我正在尝试在某些条件下从 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

4 回答 4

1

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

看到这个 sqlfiddle:http ://sqlfiddle.com/#!3/cbdca/2

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

于 2013-10-01T14:24:18.700 回答
0

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

于 2013-10-01T14:46:46.020 回答
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 中的每一行都将得到 join 表 B 中的每个匹配行。因此,表 A 中的值 1 将匹配表 B 中的 100 行 表 A 中的值 2 将匹配表 B 中的 100 行 表 A 中的值 3 将匹配表 B 中的 100 行

所以在进行 INNER join 之后,我将得到总共 300 行。

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

于 2013-10-01T20:07:25.183 回答
0

如果联接给您提供的记录多于预期,则意味着您的联接标准不完整。最极端的情况是笛卡尔连接。

检查您的加入标准。

于 2013-10-01T14:08:25.803 回答