【问题标题】:SELECT DISTINCT in DataView's RowFilter在 DataView 的 RowFilter 中选择 DISTINCT
【发布时间】:2009-03-02 15:53:28
【问题描述】:

我正在尝试根据与另一个表的关系来缩小 DataView 中的行,我使用的 RowFilter 如下;

dv = new DataView(myDS.myTable,
                 "id IN (SELECT DISTINCT parentID FROM myOtherTable)",
                 "name asc",
                 DataViewRowState.CurrentRows);

“myTable”和“myOther”表通过 myTable.ID 和 myOtherTable.parentID 关联,因此该想法是 DataView 应该只包含来自“myTable”的行,这些行在“myOtherTable”中有相应的子行。

很遗憾,我收到了这个错误;

语法错误:后面缺少操作数 'DISTINCT' 运算符。

据我所知,SQL 很好,所以我想知道在 RowFilter 的 SQL 中使用 DISTINCT 关键字是否有一些限制?有人知道吗?

【问题讨论】:

    标签: c# sql dataview


    【解决方案1】:

    不幸的是,我认为您不能在 DataView 的过滤器表达式中执行子查询。您只能在某些表达式中使用 SQL 的子集(记录在 here)。

    您可能需要单独执行子查询 (SELECT DISTINCT parentID FROM myOtherTable)。

    This article 描述了问题和可能的解决方案。

    【讨论】:

    • 我决定通过创建自己独特的 parentID 列表来解决该问题,然后将该列表传递给“id IN (...)”子句(谢天谢地,与 DISTINCT 或通过...分组)。干杯
    【解决方案2】:

    很遗憾,您不能这样做,因为 RowFilter 属性不支持 distinct 关键字。以下是您可以在 RowFilter 中执行的表达式列表(它只是一个 DataColumn 表达式):http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

    DataViews 有一个 ToTable 方法,并且几个重载使用一个布尔值来指定是否只返回不同的行。

    这是一种方法:http://msdn.microsoft.com/en-us/library/wec2b2e6.aspx

    您将如何使用它:

    DataTable newDataTable = myDataView.ToTable(true, [作为字符串的列名数组]);

    【讨论】:

      【解决方案3】:
      DataView dvBindAssignedByDropDown = new DataView();
      
      DataTable dtBindAssignedByDropDown = new DataTable();
      
      dvBindAssignedByDropDown = ds.Tables[0].DefaultView;
      
      
      string[] strColnames=new string[2];
      
      strColnames[0] = "RedNames";
      
      strColnames[1] = "RedValues";
      
      dtBindAssignedByDropDown = dvBindAssignedByDropDown.ToTable(true, strColnames);
      
      ddlAssignedby.DataTextField = "RedNamesNames";
      ddlAssignedby.DataValueField = "RedNames";
      ddlAssignedby.DataSource = dtBindAssignedByDropDown;
      ddlAssignedby.DataBind();
      ddlAssignedby.Items.Insert(0, "Assigned By");
      ddlAssignedby.Items[0].Value = "0";
      

      【讨论】:

      • 以后请尝试添加更多的东西,而不仅仅是代码,无论它的价值是什么。
      【解决方案4】:

      以下代码从表/数据视图中提取不同的值/记录,即(PROD_DESP_TRN)具有字段(CONTAINER_NO) 最后,这段代码用唯一值/记录填充一个组合框(cmbContainerNo)

      表单级声明:

      Dim dsLocal As DataSet 
      Dim dvm As DataViewManager
      Private Sub FillcomboContainer()
      
          Try
              Dim dv As DataView = New DataView
      
              cmbContainerNo.DataSource = Nothing
              dv = dvm.CreateDataView(dsLocal.Tables("PROD_DESP_TRN"))
              dv.Sort = "CONTAINER_NO"
      
              cmbContainerNo.DataSource = dv.ToTable(True, "CONTAINER_NO")
              cmbContainerNo.DisplayMember = "CONTAINER_NO"
      
          Catch ex As Exception
              MsgBox(ex.Message)
          Finally
          End Try
      End Sub
      

      【讨论】:

        【解决方案5】:

        尝试省略“DISTINCT”。在这种情况下,无论有无,结果都应该相同。从那里进行故障排除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多