2016-12-15 104 views
1

我有三個表,這裏用對象表示並轉換成SQLite表。 CategoryGroup表有多個Categories,每個Category有多個Phrases我如何做一個多表SQL的SQL Server連接

public class CategoryGroup 
{ 
    [PrimaryKey, NotNull] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Selected { get; set; } 
} 

public class Category : ICategory 
{ 
    [PrimaryKey, NotNull] 
    public int Id { get; set; } 
    public int CategoryGroupId { get; set; } 
    public string Name { get; set; } 
    public bool Selected { get; set; } 
} 

public class Phrase : IPhrase 
{ 
    public int CategoryId { get; set; } 
    [PrimaryKey, NotNull] 
    public string PhraseId { get; set; } 
    public string English { get; set; } 
    public string Romaji { get; set; } 
    public string Kana { get; set; } 
    public string Kanji { get; set; } 
    public int Modified { get; set; } 
} 

我想這樣做是CategoryGroup加入這三個表,並將它們組合,然後在選定的盤點報告。

我創建了這個SQL,但我不確定三個表連接。

SELECT CG.Id, CG.Name, COUNT(*) AS PhraseCount 
FROM CategoryGroup AS CG 
FROM Category AS C 
JOIN CG.Id = P.CategoryId 
JOIN Phrase AS P ON C.Id = P.CategoryId 
GROUP BY CG.Id 
ORDER BY CG.Name 

有人可以給我建議,我怎麼可以做的加入?

回答

1

你的語法錯了。您可以從一個表中選擇,根據某些條件加入另一個表,以便記錄匹配,然後加入第三個連接此表的其他條件。

SELECT CG.Id, CG.Name, COUNT(*) AS PhraseCount 
FROM CategoryGroup AS CG 
JOIN Category AS C ON C.CategoryGroupId = CG.Id 
JOIN Phrase AS P ON P.CategoryId = C.Id 
GROUP BY CG.Id 
ORDER BY CG.Name; 

您可能必須改爲GROUP BY CG.Id, CG.Name。這對於SQL標準並不是必需的,因爲類別組名稱在功能上依賴於類別組ID,但是一些DBMS需要這樣做(因爲他們發現很難確定功能依賴性)。我不知道SQLite在這方面。