xml列上的联接表

xml列上的联接表,xml,sql-server-2005,Xml,Sql Server 2005,在SQLServer2005数据库上,我有如下两个表 Request(RequestId int, Filter xml) DataTable(Id int,.....) filter列中有一个来自datatable的ID列表,如1013的xml 现在,我想从DataTable中选择与过滤器xml中的ID匹配的数据。这是我想到的 select d.* from request cross apply filter.nodes('Ids/Id') as Ids(id) inn

在SQLServer2005数据库上,我有如下两个表

Request(RequestId int, Filter xml)
DataTable(Id int,.....)
filter列中有一个来自datatable的ID列表,如1013的xml

现在,我想从DataTable中选择与过滤器xml中的ID匹配的数据。这是我想到的

select d.*
   from request 
   cross apply filter.nodes('Ids/Id') as Ids(id)
   inner join DataTable d on d.id = Ids.Id.value('.', 'int')
   where requestid = 35

这是可行的,但我想知道这是否是最好的方法

这就是我进行类似联接的方式(从xml参数到表)。。。如果有帮助的话


它清晰易懂

这是我能够从一个带有xml列的表的多行中提取连接的唯一方法。我使用的另一种方法是使用CTE并使用CTE中的交叉应用程序将整个结果集合并到单个XML列中。上面的例子是:

WITH tmpCTE AS
(
    SELECT
        (
            SELECT
                r.RequestID AS [requestid]
            ,   r.Filter.query('//id') AS [id]
           FROM Request AS r
           FOR XML PATH('request'), TYPE, ROOT('root')
        ) AS tmpXML
)
SELECT d.*
FROM
    tmpCTE AS tmp
    CROSS APPLY tmpXML.nodes('Ids/Id') as Ids(id)
    INNER JOIN DataTable AS d on d.id = Ids.Id.value('.', 'int')
WHERE
    requestid = 35
;
这有点多余,但我认为将整个结果集分解成XML,然后再将其分解成列是有价值的;尤其是跨多行