2015-09-22 44 views
2

我目前工作的一個數據庫項目和存在的問題之一要求如下:在Sqlite3中執行FULL OUTER JOIN以獲得兩列的組合?

該類型表包含25項。 MediaType表包含5個 條目。編寫一個SQL查詢以生成一個包含三列和125行的表格。一列應包含MediaType名稱的列表;一列 應該包含流派名稱的列表;第三列應該包含具有媒體類型和流派的每種組合的音軌的數量的計數 。對於 例如,一行是:「搖滾MPEG音頻文件XXX」,其中xxx是 數MPEG搖滾曲目,即使值爲0

認識到這一點,我相信我會需要使用Sqlite3不支持的FULL OUTER JOIN。令我困惑的部分是使用組合生成列。下面,我附上了我嘗試過的兩種方法。

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行,但他們都有的相同的計數,導致我相信GROUP BY是錯誤的。

而且,這裏是數據庫的架構:

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

+0

下次嘗試提供 [** SqlFiddle **](http://sqlfiddle.com/#!15/5368b/6),以便我們更好地理解問題並給出更快的答案 –

+0

不知道是否存在@JuanCarlosOropeza,但下次肯定會使用它。謝謝! – user3146758

+0

比圖片好得多;)也可以包含一些示例數據並要求輸出 –

回答

2

這是太長了評論。

您不使用full outer join來解決此問題。

因爲它看起來像一個家庭作業問題,我會描述解決方案。

首先,您要生成流派和媒體類型的所有組合。提示:這使用cross join

其次,你想要統計你所有的組合。提示:這使用聚合。

第三,你想把它們結合在一起。提示:左連接。