0

不确定这是否可以完成,但我正在尝试生成一个 MySQL 查询,该查询为我提供表中的每个列名以及与这些列关联的值,同时删除值的重复条目。

简而言之,我正在尝试使用数据库中表中的列名作为节点填充树视图控件。在每个节点下,我想将每列中所有非重复且非空条目列为子节点。基本上为我的应用程序创建一个类似控件的过滤器。

我正在尝试模拟 Excel 中的过滤器选项,用户可以在其中勾选所有过滤器选项以包含/排除数据。

我曾尝试构建查询,但现阶段只能管理列名。我也尝试从我的数据集构建树视图控件,但只能填充节点,而不是子节点。

感谢任何帮助,因为我仍在 VB.net 中学习 SQL

4

2 回答 2

1

使用您的建议和帮助,我设法将其转换为数据表并获得了预期的结果。谢谢你让我走上正轨。

这是我的最终结果。可能可以用更整洁的代码实现相同的结果,但这对我有用。再次感谢。

            MySQLConn.Open()

            Dim ColumnQry As New MySqlCommand("SELECT * FROM Stores WHERE 1=2", MySQLConn)
            ColumnQry.CommandType = CommandType.Text
            Dim da1 As New MySqlDataAdapter(ColumnQry)
            dasColumns.Tables.Clear()

            da1.Fill(dasColumns, "Columns")
            Dim dt1 As DataTable = dasColumns.Tables("Columns")

            For Each f As DataColumn In dt1.Columns
                trvFilter.Nodes.Add(f.ColumnName, f.ColumnName)

                Dim ValuesQry As New MySqlCommand("SELECT DISTINCT " & f.ColumnName & " FROM Stores ORDER BY " & f.ColumnName, MySQLConn)
                ValuesQry.CommandType = CommandType.Text
                Dim da2 As New MySqlDataAdapter(ValuesQry)
                dasValues.Tables.Clear()

                da2.Fill(dasValues, "Values")
                Dim dt2 As DataTable = dasValues.Tables("Values")

                For x = 0 To (dasValues.Tables("Values").Rows.Count - 1)
                    trvFilter.Nodes(f.ColumnName).Nodes.Add(dt2.Rows(x)(f.ColumnName).ToString)
                Next
            Next

            MySQLConn.Close()
于 2013-07-23T07:45:12.330 回答
0

我不认为你可以用一个查询来做到这一点。一些伪代码...

'get empty recordset, just to get all the field names
query = "SELECT * FROM mytable WHERE 1=2"
rs = conn.open(query)
'loop over the fields and add them to the treeview while storing a reference
'of the created node in variable n
foreach f in rs.fields
  set n = treeview.addnode(f.name)
  'for the created node get the unique values occuring in that column
  query = "SELECT DISTINCT " & f.name & " FROM mytable ORDER BY " & f.name
  rs2 = conn.open(query)
  'loop over the found values
  while not rs2.EOF
    'add each value to the treeview as a child of node n
    treeview.addnode(rs2.fields(f.name), n)
    rs2.MoveNext
  loop
next f
于 2013-07-22T09:10:07.900 回答