的加入讓你重複的,因爲他們有更多的而不是表示多對多關係的表,並且過濾不足以阻止多對多表根據給定的連接條件返回多行。
您可以通過以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
可以直接連接到stores
的title_id
。 (即使你沒有相應的外鍵,你還沒有包括titles
,爲通過titleauthor
或sales
引用的任何可能的不存在的名稱會被過濾掉任何一種方式。)
所以最終查詢可能如下所示:
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
如果刪除DISTINCT,您會得到什麼結果? – 2012-03-15 09:01:28
基本上和我在這裏一樣,只有重複的 – 2012-03-15 16:00:58
這是重要的「重複」;如果您將銷售ID添加到select語句中,您可能會發現在大多數情況下,這些代表不同的銷售額。換句話說,加利福尼亞州作者的總銷售額幾乎可以肯定遠大於你通過總結上述不同值所得到的大約1703美元。 – 2012-03-15 16:50:25