好的,所以我知道这个查询应该给出什么,它应该给出它输出的总和的总和。我无法弄清楚如何总结结果。我使用的数据库是发布者数据库
这是我的查询
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
答案 0 :(得分:3)
连接为您提供了重复项,因为它们包含多个表示多对多关系的表,并且过滤不足以阻止多对多表根据给定的连接条件返回多行
您可以通过以EXISTS谓词的形式引入半连接并随后在其中移动某些表来避免重复。这是在您的情况下使用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
答案 1 :(得分: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