答案 0 :(得分:0)
使用count(distinct)
代替count()
:
select s.state, count(distinct s.supp_id), count(distinct c.con_id)
正在发生的事情是,您在每个供应商的每个状态下获得笛卡尔积,并与每个消费者交叉。
更好的解决方案实际上是在加入之前聚合数据。但这是对您编写的查询的最简单更改。
答案 1 :(得分:0)
这是另一种方法:
SELECT s.state, supp_count, con_count
FROM
(SELECT s.state, COUNT(s.supp_ID) as supp_count
FROM tb_supplier s) supp
INNER JOIN
(SELECT c.state, COUNT(c.con_ID) as con_count
FROM tb_consumer c) con
ON supp.state = con.state
WHERE supp_count > con_count
当然,这种方法假设(1)供应商和消费者表中的唯一性,以及(2)供应商表中的每个供应商应该被计算为消费者表中的每个消费者,即使它们不存在于消费者表中。事务表,因为没有引用。