我正在尝试根据与另一个表的关系缩小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很好,所以我想知道在使用DISTINCT关键字作为RowFilter SQL的一部分时是否存在一些限制?有人有任何想法吗?
答案 0 :(得分:5)
不幸的是,我认为你不能在DataView的过滤器表达式中执行子查询。您只能在某些表达式中使用SQL的子集(记录为here)。
您可能需要单独执行子查询(SELECT DISTINCT parentID FROM myOtherTable
)。
This article描述了问题和可能的解决方案。
答案 1 :(得分:3)
不幸的是,你无法这样做,因为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,[列名作为字符串的数组]);
答案 2 :(得分:2)
以下代码从表/数据视图中提取不同的值/记录,即(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
答案 3 :(得分:2)
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 :(得分:1)
尝试省略“DISTINCT”。在这种情况下,结果应该相同或不相同。从那里排除故障。