它的SQL服务器:这个SQL有什么问题?
SQL:
SELECT
Tb_Supplier.State, Tb_Supplier.City,
COUNT(DISTINCT Tb_Supplier.Name) as Suppliers
Tb_Consumer.State, Tb_Consumer.City,
COUNT(DISTINCT Tb_Consumer.Name) as Consumers
它的SQL服务器:这个SQL有什么问题?
SQL:
SELECT
Tb_Supplier.State, Tb_Supplier.City,
COUNT(DISTINCT Tb_Supplier.Name) as Suppliers
Tb_Consumer.State, Tb_Consumer.City,
COUNT(DISTINCT Tb_Consumer.Name) as Consumers
SELECT
COALESCE(s.state, c.state) AS state
, COALESCE(s.city, c.city) AS city
, COALESCE(s.Suppliers, 0) AS Suppliers
, COALESCE(c.Consumers, 0) AS Consumers
FROM (
SELECT
Tb_Supplier.State
, Tb_Supplier.City
, COUNT(Tb_Supplier.Name) AS Suppliers
FROM Tb_Supplier
GROUP BY
Tb_Supplier.City
, Tb_Supplier.State
) AS s
FULL OUTER JOIN (
SELECT
Tb_Consumer.State
, Tb_Consumer.City
, COUNT(Tb_Consumer.Name) AS Consumers
FROM Tb_Consumer
GROUP BY
Tb_Consumer.City
, Tb_Consumer.State
) AS c ON s.state = c.state
AND s.city = c.city
上面的查询使用什么我以为是“主表”对供应商和消费者,所以在各行应唯一定义一个供应商或消费者。因此在上述方法中不需要count(distinct...)
。使用full outer join
是因为可能有州/市的供应商没有匹配的消费者,反之亦然。由于这个3210在最后的select子句中用于处理来自供应商或客户端的可能的NULL。
为什么要停止使用表之间的逗号:
-- Accidental Cross Join? (Cartesian Product)
-- or is it Deliberate
select * from table_one, table_two
在上面的例子每一行table_one的是由所有的行table_two的乘以。所以,如果两个表都有100行,结果是100 * 100 = 10,000行。我想要10,000行吗?
你不知道我是否想要它,它可能是故意的或者只是一个意外。
select * from table_one CROSS JOIN table_two
但现在我知道交叉连接是故意的。
回头看看你原来的问题。
FROM
Tb_Supplier, Tb_Consumer
GROUP BY
Tb_Supplier.City, Tb_Supplier.State, Tb_Consumer.City, Tb_Consumer.State
如果您有1,000名供应商和100,000名消费者,您在该子句中创建了多少行? (1,000 * 100,000 = 100,000,000)我确定这是偶然的,,这就是为什么您应该停止在from子句中的表之间使用逗号。
@dedpo您试图编辑我的评论,但该编辑已被拒绝。你想做什么?你需要什么吗? –
哪个RDBMS是为了这个?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –
[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - 在ANSI - ** 92 ** SQL标准(**超过20年前的**)中,旧式*逗号分隔的表*样式列表被替换为* proper * ANSI'JOIN'语法并且不鼓励使用它 –
为什么使用低效的交叉连接(笛卡尔积)而不是内部连接?什么错误被返回? –