我写了一个存储过程,它连接三个表来从它的表中获取省标题。这是我的代码:
BEGIN
select TbProvince.title, count(TbProvince.title) as cnt
from TbProvince
where TbProvince.provinceId IN (select TbCustomerUser.provinceId
from TbCustomerUser INNER JOIN
TbDeals
on TbCustomerUser.UserId = TbDeals.sellerUserID
where TbDeals.buyerUserID = 1
)
group by TbProvince.title
end
描述:我有三张交易,客户和省份的表格。我想检索省份名称和卖家客户的数量。 上面的代码没有问题,但只返回1作为计数。客户数量不止一个 任何人都可以帮我解决我的问题吗?
答案 0 :(得分:1)
您必须使用JOIN
表执行customer
。如果您使用半连接(在您的情况下由IN
构造表示),那么您可以避免在您的情况下预期的重复。
SELECT TbProvince.title,
COUNT(TbProvince.title) AS cnt
FROM TbProvince
JOIN TbCustomerUser ON TbProvince.provinceId = TbCustomerUser.provinceId
JOIN TbDeals ON TbCustomerUser.UserId = TbDeals.sellerUserID
WHERE TbDeals.buyerUserID = 1
GROUP BY TbProvince.title;
答案 1 :(得分:1)
应该如此简单:
您不需要该子选择。只需加入所有三个表格,您就会收到所需的结果。
SELECT TbProvince.title,
count(TbProvince.title) as cnt
FROM TbProvince
INNER JOIN TbCustomerUser
ON TbProvince.provinceId = TbCustomerUser.provinceId
INNER JOIN TbDeals
ON TbCustomerUser.UserId = TbDeals.sellerUserID
AND TbDeals.buyerUserID = 1
GROUP BY TbProvince.title
为什么你的解决方案不起作用?
您的子选择将返回provinceIDs
的{{1}}“清单”TbCustomerUser
与TbDeals
组合,并带有您的限制TbDeals.buyerUserID = 1
。
外部选择现在将返回此列表中TbProvince的所有行。
但是,对于每个达成交易的客户而言,它都没有返回。
这就是为什么你必须同时JOIN
所有三个表。
答案 2 :(得分:1)
您的查询正在过滤TbProvince
的行,然后汇总该表 - 并且只汇总该表。
相反,您希望将表连接在一起以计算客户而非省。如果使用表别名,则查询和写入更简单:
select p.Title, count(*)
from TbCustomerUser cu join
TbDeals d
on cu.UserId = d.sellerUserID join
TbProvince p
on p.provinceId = cu.provinceId
where d.buyerUserID = 1
group by p.Title;