在sqlite中加入两个表

时间:2016-05-16 11:45:37

标签: sql 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  

任何好友都可以告诉我查询。

3 个答案:

答案 0 :(得分:0)

让我们调用主表table1和第二个表table2。

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

答案 1 :(得分:0)

假设您的第二个表具有ord(order)字段,该字段表示主类别

之间的顺序
-------------------------------------------
  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

答案 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));
     }
}