XML таблица. Как удалить узлы (группы) дерева, не имеющие подчиненных листов

Anatoliy
Дата: 01.09.2005 15:39:44
Добрый день
Есть таблица, содержащая группы товаров и сами товары:

CREATE TABLE [dbo].[Entity] (
	[EntID] [int] NOT NULL ,
	[EntPrntID] [int] NOT NULL ,
	[EntType] [int] NOT NULL 
) ON [PRIMARY]


INSERT INTO Entity (EntID, EntPrntID, EntType) VALUES(0, 0, 1)
INSERT INTO Entity (EntID, EntPrntID, EntType) VALUES(1, 0, 1)
INSERT INTO Entity (EntID, EntPrntID, EntType) VALUES(2, 0, 1)
INSERT INTO Entity (EntID, EntPrntID, EntType) VALUES(3, 1, 2)
INSERT INTO Entity (EntID, EntPrntID, EntType) VALUES(4, 1, 2)

EntType = 1 - группа товара
EntType = 2 - товар
В группу могут входить как дочерние группы, так и просто товары (по аналогии папки - файлы в файловой системе).
Связь "потомок - родитель" обеспечивается с помощью полей EntID - EntPrntID
Необходимо удалить все группы товара, которые не имеют подчиненных групп или товаров.


В SQL Server данная задача решается просто:
DELETE Entity
FROM Entity e INNER JOIN
WHERE e.EntID IN  
	(
	SELECT DISTINCT ePrnt.EntID
	FROM Entity ePrnt LEFT JOIN Entity eCld ON ePrnt.EntID = eCld.EntPrntID
	WHERE ePrnt.EntType = 1 AND eCld.EntID IS NULL
	) AS eEmpty ON e.EntID = eEmpty.EntID

Возможно ли решить подобную же задачу для XML файла:

    Public Sub FillXMLEntity()
    	'Заполнить таблицу
        Dim ds As New DataSet
        Dim dt As New DataTable("Entity")
        Dim dColEntID As New DataColumn("EntID")
        Dim dColEntPrntID As New DataColumn("EntPrntID")
        Dim dColEntType As New DataColumn("EntType")
        Dim dr As DataRow
        Dim sPathXML As String = Path.Combine(Application.StartupPath, "Entity.XML")

        With dColEntID
            .DataType = System.Type.GetType("System.Int32")
            .AllowDBNull = False
            .Unique = True
            .ReadOnly = True
            .Caption = "EntID"
            .ColumnName = "EntID"
        End With 'dColID

        With dColEntPrntID
            .DataType = Type.GetType("System.Int32")
            .AllowDBNull = False
            .ReadOnly = True
            .Caption = "EntPrntID"
            .ColumnName = "EntPrntID"
        End With 'dColEntPrntID

        With dColEntType
            .DataType = Type.GetType("System.Int32")
            .AllowDBNull = False
            .ReadOnly = True
            .Caption = "EntType"
            .ColumnName = "EntType"
        End With 'dColEntType

        dt.Columns.Add(dColEntID)
        dt.Columns.Add(dColEntPrntID)
        dt.Columns.Add(dColEntType)

         dr = dt.NewRow
        dr("EntID") = 0
        dr("EntPrntID") = 0 'корень ссылается сам на себя
        dr("EntType") = 1
        dt.Rows.Add(dr)
        dt.AcceptChanges()

        dr = dt.NewRow
        dr("EntID") = 1
        dr("EntPrntID") = 0
        dr("EntType") = 1
        dt.Rows.Add(dr)
        dt.AcceptChanges()

        dr = dt.NewRow
        dr("EntID") = 2
        dr("EntPrntID") = 0
        dr("EntType") = 1
        dt.Rows.Add(dr)
        dt.AcceptChanges()

        dr = dt.NewRow
        dr("EntID") = 3
        dr("EntPrntID") = 1
        dr("EntType") = 2
        dt.Rows.Add(dr)
        dt.AcceptChanges()

        dr = dt.NewRow
        dr("EntID") = 4
        dr("EntPrntID") = 1
        dr("EntType") = 2
        dt.Rows.Add(dr)
        dt.AcceptChanges()
        ds.Tables.Add(dt)
        If DeleteFilePC(aPath:=sPathXML) = True Then _
            ds.WriteXml(sPathXML)
    End Sub


Как видно, узел с EntID = 2 не имеет подчиненных групп товаро или товаров.
Я пытаюсь удалить его:

  	Public Sub DeleteEmptyNodes()
        Dim ds As New DataSet
        Dim dt As DataTable
        Dim filterStr As String =  "e.EntID IN (SELECT DISTINCT ePrnt.EntID FROM Entity ePrnt LEFT JOIN Entity eCld ON ePrnt.EntID = eCld.EntPrntID WHERE ePrnt.EntType = 1 AND eCld.EntID IS NULL) AS eEmpty ON e.EntID = eEmpty.EntID"

         Dim dr() As DataRow
        Dim sPathXML As String = Path.Combine(Application.StartupPath, "Entity.XML")
        ds.ReadXml(sPathXML)
        dt = ds.Tables("Entity")
        Try
            dr = dt.Select(filterExpression:=filterStr)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

Выдается исключение:
"Syntax error: Missing operand after 'DISTINCT' operator."