我目前正在处理数据库项目,其中一个问题需要以下内容:
Genre表包含二十五个条目。 MediaType表包含5个 条目。编写单个SQL查询以生成包含三列和125的表 行。一列应包含MediaType名称列表;一栏 应该包含类型名称列表;第三列应包含计数 具有媒体类型和流派的每种组合的曲目数。对于 例如,一行将是:“Rock MPEG Audio File xxx”,其中xxx是 MPEG Rock曲目的数量,即使该值为0.
认识到这一点,我相信我需要使用 FULL OUTER JOIN ,而Sqlite3并不支持。令我困惑的部分是使用组合生成列。下面,我已经附上了我尝试过的两种方法。
create view T as
select MediaTypeId, M.Name as MName, GenreId, G.Name as GName
from MediaType M, Genre G
SELECT DISTINCT GName, MName, COUNT(*) FROM (
SELECT *
FROM T
OUTER LEFT JOIN MediaType
ON MName = GName
UNION ALL
SELECT *
FROM Genre
OUTER LEFT JOIN T
) GROUP BY GName, MName;
然而,这返回了近250行,GROUP BY
或JOIN
(s)完全错误。
我也尝试过:
SELECT Genre.Name as GenreName, MediaTypeName, COUNT(*)
FROM Genre LEFT OUTER JOIN (
SELECT MediaType.Name as MediaTypeName, Track.Name as TrackName
FROM MediaType LEFT OUTER JOIN Track) GROUP BY GenreName, MediaTypeName;
哪一行返回了125行,但它们都具有相同的 3503 计数,这让我相信GROUP BY
是错误的。
此外,这是数据库的架构:
答案 0 :(得分:2)
评论太长了。
您不能使用full outer join
来解决此问题。
因为它看起来像是一个家庭作业问题,我将描述解决方案。
首先,您要生成流派和媒体类型的所有组合。提示:这使用cross join
。
其次,您想要计算您拥有的所有组合。提示:这使用聚合。
第三,你想把它们结合在一起。提示:左连接。