【问题标题】:Using count in three joint tables in Oracle SQLOracle SQL中三个联表使用count
【发布时间】:2017-04-09 16:06:41
【问题描述】:

脚本 1

select supplier.suppl_no, name, count(art_no) TotalArticles 
from article, supplier 
where article.suppl_no = supplier.suppl_no and supplier.suppl_no = 20009
group by supplier.suppl_no, name;

结果:TotalArticles = 51

脚本 2

select supplier.suppl_no, name, count(ord_no) TotalOrders 
from orders, supplier 
where orders.suppl_no = supplier.suppl_no and supplier.suppl_no = 20009
group by supplier.suppl_no, name;

结果:TotalOrders = 74

现在,我想将以上两个脚本合二为一,如下所示。

脚本 3

select article.suppl_no, name, count(art_no) "TotalArticles", count(ord_no) "TotalOrders" 
from article, supplier, orders 
where article.suppl_no = supplier.suppl_no and supplier.suppl_no = orders.suppl_no and supplier.suppl_no = 20009
group by article.suppl_no, name

结果:TotalArticles = 3774(在第一个脚本中预期为 51)
结果:TotalOrders = 3774(第二个脚本中预期为 74)

所以,对于 TotalArticles 和 TotalOrders,它给我的结果是 51 * 74 = 3774。你能帮我弄清楚我在脚本 3 中犯了什么错误吗?非常感谢。

【问题讨论】:

  • stackoverflow.com/editing-help(标记代码并单击{}。在需要的地方添加换行符。)
  • 请发布一些示例数据和期望的结果。在这里你可以找到一些有用的东西来构建一个minimal reproducible example
  • 试试count(distinct art_no) 看看会发生什么。 (或保留原始查询。)

标签: sql oracle join count


【解决方案1】:

你有一对多的关系,所以加入多个行。要么使用distinct:

select a.suppl_no, name, count(distinct art_no) "TotalArticles", count(distinct ord_no) "TotalOrders" 
from article a inner join supplier s on (a.suppl_no = s.suppl_no) inner join orders o on (s.suppl_no = o.suppl_no)
where s.suppl_no = 20009
group by a.suppl_no, name;

或在with 语句中产生计数:

with co as (
  select s.suppl_no, name, count(ord_no) TotalOrders 
    from orders o inner join supplier s on (o.suppl_no = s.suppl_no)
    where s.suppl_no = 20009
    group by s.suppl_no, name),
ca as (
  select s.suppl_no, name, count(art_no) TotalArticles 
    from article a inner join supplier s on (a.suppl_no = s.suppl_no)
    where s.suppl_no = 20009
    group by s.suppl_no, name)
select s.suppl_no, ca.TotalArticles, co.TotalOrders 
  from supplier, ca, co 
  where s.suppl_no = 20009;

在两者中你都应该使用隐式连接,别名也使查询更具可读性

【讨论】:

  • 非常感谢。根据您的建议,我刚刚添加了 'distinct',它给了我预期的结果 :) count( distinct art_no) "TotalArticles", count( distinct ord_no) "TotalOrders"
【解决方案2】:

试试这个。

        select a.suppl_no,name,
        count(a.art_no) "TotalArticles", 
        count(o.ord_no) "TotalOrders"
        from article a 
        inner join on  supplier s on a.suppl_no = s.suppl_no and s.suppl_no = 20009
        inner join on  orders o on o.suppl_no = s.suppl_no  
        group by article.suppl_no, name

【讨论】:

  • 这毫无意义。您在订单上加入带有 njo 条件的订单表。所以它交叉加入。
  • 谢谢 :) 经过一番更正并添加“计数”select a.suppl_no, name, count(distinct a.art_no) "TotalArticles", count(distinct o.ord_no) "TotalOrders" from article a inner join supplier s on a.suppl_no = s.suppl_no and s.suppl_no = 20009 inner join orders o on o.suppl_no = s.suppl_no group by a.suppl_no, name;
猜你喜欢
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多