分层数据搜索

时间:2016-01-15 06:46:24

标签: ms-access

我有一个表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。

1 个答案:

答案 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

感谢您的帮助!