迭代加入

时间:2018-01-29 13:37:37

标签: mysql sql xml

我有两个表,其中一个是容器,另一个是项目。 我想找到一个项目然后找到包含该特定项目的所有容器。 我有查询,但它只会找到一个容器。它的所有XML都使它变得有点复杂。

(我在xml里面的table1中搜索,然后当我找到我想要的东西时,我从col获取guid然后使用我在table1中找到的guid在table12 xml中搜索)

表1

Guid |    Name   |   t1XML
 1          n1       file1
 2          n2       file2

表2

Guid   |    Name   |   t2XML
  7          n7        cont7
  9          n9        cont9

** guids是普通的guids(36 char)

这就是我所拥有的

DECLARE @searchFor NVARCHAR(max)=N'context' 
SELECT t1.Name as itemName, t1.Guid, t2.Name
FROM table1 AS t1 
JOIN table2 AS t2 ON t2.t2XML.query('/t/n').value('.', 'VARCHAR(36)')= CAST(t1.Guid as varchar(36))
WHERE t1.t1XML.exist(N'/t/am[text()[1]=sql:variable("@searchFor")]')=1 order by t2.Name

所以我想要的是,当我从t1找到一个具有' context'的项目时,我希望连接迭代到t2并查找具有该项目的所有容器。

1 个答案:

答案 0 :(得分:0)

我能够弄清楚这一点

DECLARE @searchFor NVARCHAR(max)=N'context'  
SELECT DISTINCT t2.Name , t2.Guid , filtered.Name 
FROM table2 AS t2
JOIN (
   SELECT DISTINCT t1.Name, lower(t1.Guid) as t1GUid
   FROM table1 AS t1
   WHERE t1.t1XML.exist(N'/t/am[text()[1]=sql:variable("@searchFor")]')=1 
) AS filtered
ON t2.t2XML.exist(N'/t/n[text()[1]=sql:column("filtered.t1Guid")]')=1