Sql server SQL中的内部联接和分组方式,不带聚合函数。

Sql server SQL中的内部联接和分组方式,不带聚合函数。,sql-server,tsql,Sql Server,Tsql,我试图在某些条件下从表2中检索数据。当我用条件进行内部连接时,我得到了一个巨大的值(200000个数据)。但当我分组时,得到的值非常少,比如(8000个数据) 选择Tcg.SK_tID、Tcg.SK_ServiceProviderID 进入#CHDetails 来自#客户群Tcg 在chd.SK_-PID=Tcg.SK_-PID上将dbo.Component作为chd进行内部连接 和chd.SK_ServiceProviderID=Tcg.SK_ServiceProviderID 和chd.SK

我试图在某些条件下从表2中检索数据。当我用条件进行内部连接时,我得到了一个巨大的值(200000个数据)。但当我分组时,得到的值非常少,比如(8000个数据)

选择Tcg.SK_tID、Tcg.SK_ServiceProviderID
进入#CHDetails
来自#客户群Tcg
在chd.SK_-PID=Tcg.SK_-PID上将dbo.Component作为chd进行内部连接
和chd.SK_ServiceProviderID=Tcg.SK_ServiceProviderID
和chd.SK_CompID=@chd
和chd.ReportDate<@ReportDate
按Tcg.SK_PID、Tcg.SK_服务提供商ID分组
你能告诉我这件事的原因吗。内部联接始终采用公共数据。 #ClientGroup表中的数据约为70000,而dbo.Component中的数据非常庞大。当我在逻辑上查询公共PID和服务提供商时,它应该给我等于或小于#ClientGroup的记录。如何给予更多


当我分组时,我得到8000。但是为什么我要在两个表的内部联接中进行分组呢。

如果联接给您的记录比预期的多,这意味着您的联接条件不完整。这种情况的极端情况是笛卡尔连接


检查您的加入标准。

如果加入给您的记录比预期的多,则表示您的加入标准不完整。这种情况的极端情况是笛卡尔连接


检查您的加入标准。

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

看这把小提琴:


其中,表1有3行,表2有3行。当连接在一起时,它们返回9行。

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

看这把小提琴:


其中,表1有3行,表2有3行。当连接在一起时,它们返回9行。

Group by将行组合在一起。通常是生成聚合数据或生成唯一值列表。在您的示例中,将#ClientGroup表分组在一起,返回的行总数将收缩。您应该比#ClientGroup中的行少。

groupby将行组合在一起。通常是生成聚合数据或生成唯一值列表。在您的示例中,将#ClientGroup表分组在一起,返回的行总数将收缩。您得到的行数应该少于#ClientGroup中的行数。

这不会减少行数,因为内部联接不执行DISTINCT,而是从两个表中查找所有匹配的数据

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

现在在这个例子中,如果我在表A和表B之间进行内部联接 然后,A中的每一行都将连接表B中的每一个匹配行。 所以 表A中的值1将匹配表B中的100行 表A中的值2将匹配表B中的100行 表A中的值3将匹配表B中的100行

所以在做了内部连接之后,我将得到总共300行


相反,如果表B具有完全不同的值(1,2,3除外),则内部联接将不会产生任何结果。

它不会减少行数,因为内部联接不执行DISTINCT,而是内部联接从两个表中查找所有匹配的数据

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

现在在这个例子中,如果我在表A和表B之间进行内部联接 然后,A中的每一行都将连接表B中的每一个匹配行。 所以 表A中的值1将匹配表B中的100行 表A中的值2将匹配表B中的100行 表A中的值3将匹配表B中的100行

所以在做了内部连接之后,我将得到总共300行


相反,如果表B具有完全不同的值(1,2,3除外),则内部联接将不会产生任何结果。

删除group by子句时会发生什么?我最近的发现是,groupby本质上就像一个独立的子句。在这种情况下,您使用group by的原因是什么?没有聚合?是的,您是正确的group by使其与众不同。但是从逻辑上讲,记录的计数应该小于#ClientGroup table count。但我得到的是200000的巨大数据,而不是8000的数据,或者与#ClientGroup的计数(如果它与所有记录都匹配的话)相同,我才意识到我误解了你的问题;我道歉。indio的答案似乎是问题所在,但我必须查看表的模式。他解释的是,你的内在连接可能没有正确连接。有些东西提供了比预期更多的结果。我将进一步研究它,看看能找到什么。删除GROUPBY子句时会发生什么?我最近的发现是,groupby本质上就像一个独立的子句。在这种情况下,您使用group by的原因是什么?没有聚合?是的,您是正确的group by使其与众不同。但是从逻辑上讲,记录的计数应该小于#ClientGroup table count。但我得到的是200000的巨大数据,而不是8000的数据,或者与#ClientGroup的计数(如果它与所有记录都匹配的话)相同,我才意识到我误解了你的问题;我道歉。indio的答案似乎是问题所在,但我必须查看表的模式。他在解释什么
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