求助:合并Tb_Requests与TB_Offers计数查询,实现产品关联统计
解决SQL多表计数匹配问题
你原来的查询错误在于直接关联三个表产生了笛卡尔积,导致Tb_Requests和TB_Offers的记录交叉相乘,最终两个计数结果被错误放大且数值相同。比如某产品有3条请求、2条报价,交叉后会生成6条记录,因此两个count都会返回6,和实际数据不符。
正确的做法是先分别统计每个产品的报价数和请求数,再将统计结果与产品表关联,避免交叉计数:
SELECT p.[Name], COALESCE(offer_counts.[# of Offers], 0) AS '# of Offers', COALESCE(request_counts.[# of Requests], 0) AS '# of Requests' FROM Tb_Product p LEFT JOIN ( -- 预统计每个产品的报价记录数 SELECT Prod_ID, COUNT(Supp_ID) AS '# of Offers' FROM TB_Offers GROUP BY Prod_ID ) offer_counts ON p.Prod_ID = offer_counts.Prod_ID LEFT JOIN ( -- 预统计每个产品的请求记录数 SELECT Prod_ID, COUNT(Con_ID) AS '# of Requests' FROM Tb_Requests GROUP BY Prod_ID ) request_counts ON p.Prod_ID = request_counts.Prod_ID;
关键说明:
- 两个子查询分别独立统计报价和请求的数量,避免了表关联时的交叉相乘问题
- 使用
LEFT JOIN确保所有产品都能被列出,哪怕该产品没有对应的报价或请求记录 COALESCE函数将NULL值替换为0,让没有记录的产品计数显示为0,结果更直观
如果只需要显示有报价或请求的产品,可将LEFT JOIN替换为INNER JOIN。
内容的提问来源于stack exchange,提问作者5h34rcon
相关产品推荐
相关产品推荐

