2012-03-15 75 views
1

好吧,我知道這個查詢應該給出什麼,它應該給出它輸出的總和。我無法弄清楚如何總結結果。我現在用的數據庫是出版商數據庫總結查詢結果

這裏是我的查詢

SELECT DISTINCT authors.state, qty*price as total 
from authors 
JOIN titleauthor on titleauthor.au_id = authors.au_id 
JOIN titles on titles.title_id = titleauthor.title_id 
JOIN sales on sales.title_id = titles.title_id 
JOIN stores on stores.stor_id = sales.stor_id 
WHERE authors.state LIKE stores.state 

,這裏是它給

CA 104.6500 
CA 299.8000 
CA 299.8500 
CA 1000.0000 
+1

如果刪除DISTINCT,您會得到什麼結果? – 2012-03-15 09:01:28

+0

基本上和我在這裏一樣,只有重複的 – 2012-03-15 16:00:58

+0

這是重要的「重複」;如果您將銷售ID添加到select語句中,您可能會發現在大多數情況下,這些代表不同的銷售額。換句話說,加利福尼亞州作者的總銷售額幾乎可以肯定遠大於你通過總結上述不同值所得到的大約1703美元。 – 2012-03-15 16:50:25

回答

3

的加入讓你重複的,因爲他們有更多的而不是表示多對多關係的表,並且過濾不足以阻止多對多表根據給定的連接條件返回多行。

您可以通過以EXISTS謂詞的形式引入半連接並隨後移動其中的某些表來避免重複。下面是使用的一種可能的方式存在於你的情況:

SELECT 
    stores.state, 
    SUM(qty * price) 
FROM sales 
INNER JOIN stores ON sales.stor_id = stores.stor_id 
INNER JOIN titles ON sales.title_id = stores.title_id 
WHERE EXISTS (
    SELECT * 
    FROM authors a 
    INNER JOIN titelauthor ta ON a.au_id = ta.au_id 
    WHERE ta.titel_id = titles.title_id 
    AND a.state LIKE stores.state 
) 
GROUP BY 
    stores.state 

中央臺是最有可能sales,這是其中的數字從何而來。因此,查詢正在建立在sales左右。其他表格顯式連接(使用JOIN子句),只要它們對sales的每一行只返回一行。一旦表格返回多於一行,它就會被移動到EXISTS。

還有一件事。在處理這個查詢時,我注意到一個連接可能是多餘的(在你的查詢和我的查詢中)。該表是titles。如果您的外鍵正常,您不需要連接到titles,因爲titleauthor可以直接連接到storestitle_id。 (即使你沒有相應的外鍵,你還沒有包括titles,爲通過titleauthorsales引用的任何可能的不存在的名稱會被過濾掉任何一種方式。)

所以最終查詢可能如下所示:

SELECT 
    stores.state, 
    SUM(qty * price) 
FROM sales 
INNER JOIN stores ON sales.stor_id = stores.stor_id 
WHERE EXISTS (
    SELECT * 
    FROM authors a 
    INNER JOIN titelauthor ta ON a.au_id = ta.au_id 
    WHERE ta.titel_id = sales.title_id 
    AND a.state LIKE stores.state 
) 
GROUP BY 
    stores.state 
+0

但是,您是否需要包含標題以便您可以在select語句中訪問價格?我忘了提及價格來自titles表。 – 2012-03-16 16:44:23

+0

在這種情況下,是的,需要'titles'。這是第一個選項。 – 2012-03-16 16:48:31

0
輸出
SELECT DISTINCT authors.state, sum(qty*price) as total 
from authors 
JOIN titleauthor on titleauthor.au_id = authors.au_id 
JOIN titles on titles.title_id = titleauthor.title_id 
JOIN sales on sales.title_id = titles.title_id 
JOIN stores on stores.stor_id = sales.stor_id 
WHERE authors.state = stores.state 
group by authors.stat 
+0

這不是我期望得到的價值。我預計會得到1704左右,這是我查詢的總和 – 2012-03-15 08:42:18

+0

你有什麼價值? – 2012-03-15 08:44:14

+0

我得到了'CA 3303.9000' – 2012-03-15 14:38:14