在SQL左联接查询中获得比预期更多的结果

在SQL左联接查询中获得比预期更多的结果,sql,sql-server,tsql,join,left-join,Sql,Sql Server,Tsql,Join,Left Join,我的代码是这样的: SELECT COUNT(*) FROM earned_dollars a LEFT JOIN product_reference b ON a.product_code = b.product_code WHERE a.activity_year = '2015' 我试图根据两个表的产品代码来匹配它们。我预计从中得到的结果数量与表a中的总记录数量相同(2015年)。但出于某种原因,我已经接近300万了 表a有大约40000000条记录,表b有2000条记录。当我在没有连接

我的代码是这样的:

SELECT COUNT(*)
FROM earned_dollars a
LEFT JOIN product_reference b ON a.product_code = b.product_code
WHERE a.activity_year = '2015'
我试图根据两个表的产品代码来匹配它们。我预计从中得到的结果数量与表a中的总记录数量相同(2015年)。但出于某种原因,我已经接近300万了


表a有大约40000000条记录,表b有2000条记录。当我在没有连接的情况下运行这个语句时,我得到了2500000个结果,所以即使使用左连接,我也希望得到这个结果,但不知怎的,我得到了30000000个结果。有什么想法吗?我甚至参考了中的图表。

这意味着要么您的左联接只使用了部分外键,这会导致行乘法,要么联接表中存在重复的行


使用
COUNT(DISTINCT a.product\u code)

这意味着您的左联接只使用了部分外键,这会导致行乘法,或者联接表中存在重复的行


使用
COUNT(不同的a.product\u代码)

您试图用tsql回答的问题是什么

尝试选择a.产品代码,b.产品代码,而不是选择计数(*)。这将显示哪些记录匹配,哪些不匹配

还应添加一个b.product_代码不为空的位置。这应该排除不匹配的记录


b是父表,a是子表?请尝试右连接。

您试图用tsql回答的问题是什么

尝试选择a.产品代码,b.产品代码,而不是选择计数(*)。这将显示哪些记录匹配,哪些不匹配

还应添加一个b.product_代码不为空的位置。这应该排除不匹配的记录


b是父表,a是子表?请尝试右联接。

或使用表的唯一标识符,即


选择COUNT(a.earned\u dollars\u id)

或使用表的唯一标识符,即


选择COUNT(a.earned\u dollars\u id)

不确定数据模型的外观和结构,但我猜您只关心earned\u dollars

SELECT COUNT(*)
FROM earned_dollars a
WHERE a.activity_year = '2015'
and exists (select 1 from product_reference b ON a.product_code = b.product_code)

不确定您的数据模型是什么样子,以及它是如何构造的,但我猜您只关心赚来的钱

SELECT COUNT(*)
FROM earned_dollars a
WHERE a.activity_year = '2015'
and exists (select 1 from product_reference b ON a.product_code = b.product_code)

你到底想数什么?两个表中每个产品代码都不止一行?我猜是因为同一个产品可能会在几年内销售,你也会得到这些。。。consdier将where移动到ON并将结果限制到b.Product_代码不为空的位置。Product_代码在Product_参考中是否唯一?您的查询是“2015年有多少对挣到的美元和产品参考,包括没有产品参考的挣到的美元。”你的问题是,这不是你想问的,但不清楚你到底想问什么。如果你想问“挣到的美元中有多少行有匹配的产品”,你需要@XenoPuTtSs回答。如果你的意思是其他,那么请澄清。你到底想算什么?两个表中每个产品代码超过一行?我猜是因为同一产品可能在多年内销售,你也会得到这些。。。consdier将where移动到ON并将结果限制到b.Product_代码不为空的位置。Product_代码在Product_参考中是否唯一?您的查询是“2015年有多少对挣到的美元和产品参考,包括没有产品参考的挣到的美元。”你的问题是,这不是你想问的,但不清楚你到底想问什么。如果你想问“挣到的美元中有多少行有匹配的产品”,你需要@XenoPuTtSs回答。如果您的意思是其他,那么请澄清。这实际上是一个更大的INSERT语句的一部分,该语句基于产品代码匹配,将产品名称从我的产品参考表引入挣值溢价表。我刚刚在这里将其分解为一个SELECT来演示我遇到的问题。这实际上是一个更大的INSERT语句的一部分,该语句基于产品代码匹配,将产品名称从我的产品参考表引入挣值溢价表。我刚刚把它分解成一个选择,在这里演示我遇到的问题。