在Sqlite3中进行全外连接以获得两列的组合?

时间:2015-09-22 15:31:03

标签: sql sqlite left-join outer-join

我目前正在处理数据库项目,其中一个问题需要以下内容:

  

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 BYJOIN(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是错误的。

此外,这是数据库的架构:

https://www.dropbox.com/s/onnbwqfrfc82r1t/IMG_2429.png?dl=0

1 个答案:

答案 0 :(得分:2)

评论太长了。

您不能使用full outer join来解决此问题。

因为它看起来像是一个家庭作业问题,我将描述解决方案。

首先,您要生成流派和媒体类型的所有组合。提示:这使用cross join

其次,您想要计算您拥有的所有组合。提示:这使用聚合。

第三,你想把它们结合在一起。提示:左连接。