2012-03-15 76 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