2016-11-25 22 views
-1

腳本1使用在三個聯合表計數的Oracle SQL

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中犯了什麼錯誤?非常感謝。

+0

https://stackoverflow.com/編輯幫助(標記代碼並單擊'{}'。在需要的地方添加換行符。) – jarlh

+0

請發佈一些示例數據和所需結果。在這裏,你找到一些有用的建立[mcve] – Aleksej

+2

嘗試'count(distinct art_no)'並且看看會發生什麼。 (或保留原始查詢。) – jarlh

回答

0

試試這個。

 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 
+0

這是沒有意義的。您可以在訂單中加入njo條件的訂單表。所以它交叉加入。 – Kacper

+0

謝謝:)它的工作有點校正後,加入 '計數' '選擇a.suppl_no,名稱, 計數(不同a.art_no) 「TotalArticles」, 計數(不同o.ord_no)「TotalOrders 「 從製品的 內連接的供應商S於a.suppl_no = s.suppl_no和s.suppl_no = 20009 內由a.suppl_no,名稱上o.suppl_no =加入級O s.suppl_no 基;' – zilhaz

1

你有一對多的關係,所以連接多行。在with聲明

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; 

或產生計數:要麼使用distinct

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; 

在這兩個你應該使用隱式連接,別名也讓查詢更易讀

+0

謝謝許多。根據你的建議,我剛加了'distinct',它給了我預期的結果:) count(distinct art_no)「TotalArticles」,count(distinct ord_no)「TotalOrders」 – zilhaz