SELECT DISTINCT в RowFilter DataView

Я пытаюсь сузить строки, которые находятся в моем 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 как часть SQL RowFilter? У кого-нибудь есть идеи?


person Christopher McAtackney    schedule 02.03.2009    source источник


Ответы (5)


К сожалению, я не думаю, что вы можете выполнить подзапрос в выражении фильтра DataView. В некоторых выражениях разрешено использовать только подмножество SQL (задокументировано здесь).

Возможно, вам потребуется выполнить подзапрос (SELECT DISTINCT parentID FROM myOtherTable) отдельно.

В этой статье описывается проблема и возможное решение.

person Matt Peterson    schedule 02.03.2009
comment
Я решил обойти проблему, создав свой собственный отдельный список идентификаторов родителей, а затем просто передав этот список в предложение id IN (...) (которое, к счастью, поддерживается, в отличие от DISTINCT или GROUP BY). Ваше здоровье - person Christopher McAtackney; 02.03.2009

К сожалению, вы не можете сделать это таким образом, так как свойство RowFilter не поддерживает ключевое слово different. Вот список выражений, которые вы можете выполнять в RowFilter (это просто выражение DataColumn): http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

Представления данных имеют метод ToTable, и несколько перегрузок принимают логическое значение, чтобы указать, следует ли возвращать только отдельные строки.

Вот один из способов: http://msdn.microsoft.com/en-us/library/wec2b2e6.aspx

Вот как вы могли бы его использовать:

DataTable newDataTable = myDataView.ToTable(true, [массив имен столбцов в виде строк]);

person DarrellNorton    schedule 19.11.2010

следующий код извлекает отдельные значения/записи из таблицы/представления данных, а именно (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
person Arshed Mahmood    schedule 05.01.2011

Попробуйте просто пропустить "DISTINCT". При этом результаты должны быть одинаковыми как с так и без. Устраняйте неполадки оттуда.

person Mark A Johnson    schedule 02.03.2009

person    schedule
comment
В будущем, пожалуйста, попробуйте добавить что-то большее, чем просто код, какой бы ни была его ценность. - person Paweł Dyda; 20.05.2011