我在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 :(得分: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
答案 2 :(得分:0)
您在问题中显示的预期结果实际上并不是有效的表格。结果集不能包含可变数量的列。您似乎想要一个包含每个类别的列的结果。
使用JOIN可以做的是这样的(假设表名是categories
和subcategories
):
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));
}
}