的加入让你重复的,因为他们有更多的而不是表示多对多关系的表,并且过滤不足以阻止多对多表根据给定的连接条件返回多行。
您可以通过以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