2016-03-12 30 views
-6

它的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 
+1

哪个RDBMS是为了这个?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

+0

[踢坏的习惯:使用旧式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'语法并且不鼓励使用它 –

+0

为什么使用低效的交叉连接(笛卡尔积)而不是内部连接?什么错误被返回? –

回答

1
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子句中的表之间使用逗号。

+0

@dedpo您试图编辑我的评论,但该编辑已被拒绝。你想做什么?你需要什么吗? –