我有一个表CATEGORY,我有类别。每个类别可能有子类别(或子项)。如果它是主类别parent = 0,否则它等于父ID。例如,
ID |Category |Parent
1 Fruit 0
2 Apple 1
3 Orange 1
4 Vegetable 0
5 Onion 4
6 Tomato 4
7 Red Apple 2
8 Green Apl 2
因此,使用代码我可以创建以下列表
Fruit
- Apple
- Red Apple
- Green Apl
- Orange
Vegetable
- Onion
- Tomato
我有其他表SOLD_ITEMS,我使用CATEGORY.ID。
1)有人可以帮我执行查询FROM SOLD_ITEMS WHERE CATEGORY.ID等于Fruit还是其中任何一个孩子?
我或许可以在SQL之外编写它并生成一个查询字符串,如:WHERE CATEGORY.ID IN(1,2,3,4,7,8),我只是想知道是否有替代方法可以做到这一点在SQL语句中
2)使用SQL,是否有一个查询,我可以在给定CATEGORY.ID的情况下获得最高父级?例如对于8(绿色Apl)将是1.对于4(蔬菜)将是4。
我可能会使用SQL复杂化,我可能不会。我还没有那么熟练使用SQL。
答案 0 :(得分:0)
我读到了嵌套集模型,虽然查询将被简化,但它增加了INSERT,UPDATE,更改父等的复杂性。我必须确保Category_ID中的每个更改都反映在链接到Category_ID的当前记录中。
所以,我决定使用VB.net TreeView1。它可能不是最佳答案,但实施起来很简单
Sub Load_Cateogries(treeview1 As TreeView)
Dim ds As New DataSet
Dim sSQL As String
treeview1.Nodes.Clear()
Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand
sSQL = "SELECT * FROM Product_Categories WHERE Parent=0"
cmd.CommandText = sSQL
If Query_DB(cmd, ds) Then
For i = 0 To ds.Tables(0).Rows.Count - 1
Dim TNode As TreeNode
TNode = treeview1.Nodes.Add(ds.Tables(0).Rows(i).Item("Category").ToString)
TNode.Tag = ds.Tables(0).Rows(i).Item("Category_ID").ToString
Load_Category(TNode.Tag, TNode)
Next
End If
treeview1.ExpandAll()
End Sub
Sub Load_Category(iParent As Integer, tn As TreeNode)
Dim ds As New DataSet
Dim sSQL As String
Dim cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand
sSQL = "SELECT * FROM Product_Categories WHERE Parent=" & iParent
cmd.CommandText = sSQL
If Query_DB(cmd, ds) Then
For i = 0 To ds.Tables(0).Rows.Count - 1
Dim TNode As TreeNode
TNode = tn.Nodes.Add(ds.Tables(0).Rows(i).Item("Category").ToString)
TNode.Tag = ds.Tables(0).Rows(i).Item("Category_ID").ToString
Load_Category(TNode.Tag, TNode)
Next
End If
ds.Dispose()
End Sub
对类别及其子项的查询可以完成为
对于这种情况下的selectednode "SELECT * FROM Product_Categories WHERE Category_ID IN (" & Get_Parent_and_Childs() & ")"
,让控件对其进行排序(函数TreeView1.Nodes.Find()如果你想要一个特定的Parent而不让用户选择它就会变得有用。)
Function Get_Parent_and_Childs() As String
Dim sTag As String = ""
If TreeView1.SelectedNode IsNot Nothing Then
sTag = TreeView1.SelectedNode.Tag
Get_Child(sTag, TreeView1.SelectedNode)
End If
Return sTag
End Function
Sub Get_Child(ByRef sTag As String, nParent As TreeNode)
For Each n As TreeNode In nParent.Nodes
sTag &= ", " & n.Tag
Get_Child(sTag, sDesc, n)
Next
End Sub
感谢您的帮助!