2016-05-16 32 views
0

我在sqlite的一個表中的兩個表包含主要類別,另一個是子類連接兩個表中的SQLite

------------------ 
cat_id | cat_title 
    1 | cat_1 
    2 | cat_2 
------------------ 

----------------------------------- 
    subcat_id | subcat_title | cat_id 
    1  | subcat_1 | 1 
    2  | subcat_2 | 2 
    3  | subcat_3 | 2 
    4  | subcat_4 | 1 

預期的結果是

----------------------------------- 
     cat_1  | cat_2 
    subcat_2  | subcat_1 
    subcat_3  | subcat_4 

可以在任何哥們告訴我的查詢。

回答

0

讓我們調用主表table1和第二個表table2。

SELECT table2.subcat_title, table1.cat_title FROM table2 INNER JOIN on table1.cat_id=table2.cat_id 
+0

謝謝。它的工作 – Avim

+0

@AvinashMulewa:真的嗎?但你在你的問題中畫了其他的東西 – AnatolyS

+0

是的這不是完全相同的結果,但結果可以解決我的問題 – Avim

0

假設你的第二個表有ORD(訂單)字段,表示中的主要類別順序

------------------------------------------- 
    subcat_id | subcat_title | cat_id | ord 
    1  | subcat_1 | 1 | 1 
    2  | subcat_2 | 2 | 1 
    3  | subcat_3 | 2 | 2 
    4  | subcat_4 | 1 | 2 

還你ORD(訂單)表,可以覆蓋所有的子類別

------------- 
    ord 
    1  
    2  
    3  
    4  
    ... 
    10000  

在這種情況下,你可以解決你的任務:

select 
    (select subcat_title from subcat where subcat.catid = 1 and subcat.ord = ord.ord) as subcat_for_cat1, 
    (select subcat_title from subcat where subcat.catid = 2 and subcat.ord = ord.ord) as subcat_for_cat2 
from ord 

http://www.sqlfiddle.com/#!7/0e54c/2

0

您在問題中顯示的預期結果並非真正有效的表格。您的結果集不能包含可變數量的列。您似乎需要包含每個類別的的結果。

什麼你可以用JOIN做的是這樣的(假設表名是categoriessubcategories):

SELECT categories.cat_title, subcategories.subcat_title 
FROM categories INNER JOIN subcategories 
    ON categories.cat_id = subcategories.cat_id 

,這將給你設置這樣的結果:

cat_title  subcat_title 
============================= 
cat_1   subcat_2 
cat_1   subcat_3 
cat_2   subcat_1 
cat_2   subcat_4 

在您的客戶端代碼可以使用該結果集並構建字典或任何合適的數據結構,以滿足您構建所需結果的需求。


如何使用結果集來構建一個字典使用SqlDataReader一個簡單的例子:

Dictionary<string,List<string>> result = new Dictionary<string, List<string>>(); 
/* suppose we have a SqlCommand command with the query from above */ 
using (SqlDataReader reader = command.ExecuteReader()) 
{ 
    while(reader.Read()) 
    { 
     string cat = reader.GetString(0); 
     if (!result.ContainsKey(cat)) 
      result.Add(cat, new List<string>()); 

     result[cat].Add(reader.GetString(1)); 
    } 
}