Как объединить два поля xml с неизвестными именами параметров во время разработки - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть две таблицы, которые должны быть объединены на основе соответствия XML.Использование xml объясняется тем, что неизвестный набор значений во время разработки.Я написал 3 сенарио ниже.Спасибо за любую помощь, которую вы можете предоставить.

Таблица A
Id
xml

Таблица B
Id
xml

Таблица A
1, <parms><parm><name>Parm1</name><value>X</value></parm></parms>
2, <parms><parm><name>Parm1</name><value>Y</value></parm><br> <parm><name>Parm2</name><value>123</value></parm></parms><br> 3, <parms><parm><name>Parm1</name><value>Y</value></parm><br> <parm><name>Parm2</name><value>578</value></parm></parms>

Таблица B
7, <parms><parm><name>Parm1</name><value>X</value></parm></parms>
8, <parms><parm><name>Parm1</name><value>Y</value></parm><br> <parm><name>Parm2</name><value>123</value></parm></parms>
9, <parms><parm><name>Parm1</name><value>Y</value></parm><br> <parm><name>Parm2</name><value>123</value></parm><br> <parm><name>Parm2</name><value>578</value></parm></parms>

Запрос Что-то вроде этого, но мне нужна помощь с объединением.

select A.Id  
     , B.Id  
  from TableA A  
 inner join TableB B  
    on ???

Ожидаемые результаты

A.Id   B.Id  
1       7  
2       8  
3       8  
3       9  

1 Ответ

0 голосов
/ 05 апреля 2011
declare @TableA table (id int, xmlCol xml)
declare @TableB table (id int, xmlCol xml)

insert into @TableA values
(1, '<parms><parm><name>Parm1</name><value>X</value></parm></parms>'),
(2, '<parms><parm><name>Parm1</name><value>Y</value></parm>
<parm><name>Parm2</name><value>123</value></parm></parms>'),
(3, '<parms><parm><name>Parm1</name><value>Y</value></parm>
<parm><name>Parm2</name><value>578</value></parm></parms>')

insert into @TableB values
(7, '<parms><parm><name>Parm1</name><value>X</value></parm></parms>'),
(8, '<parms><parm><name>Parm1</name><value>Y</value></parm>
<parm><name>Parm2</name><value>123</value></parm></parms>'),
(9, '<parms><parm><name>Parm1</name><value>Y</value></parm>
<parm><name>Parm2</name><value>123</value></parm>
<parm><name>Parm2</name><value>578</value></parm></parms>')

;with cteA as
(
  select 
    A.id,
    p.value('name[1]', 'varchar(50)') as Name,
    p.value('value[1]', 'varchar(50)') as Value
  from @TableA as A
    cross apply A.xmlCol.nodes('parms/parm') as n(p)
), cteB as
(
  select 
    B.id,
    p.value('name[1]', 'varchar(50)') as Name,
    p.value('value[1]', 'varchar(50)') as Value
  from @TableB as B
    cross apply B.xmlCol.nodes('parms/parm') as n(p)
)
select distinct
  A.id as 'A.id',
  (select top 1 B.id
   from cteB as B
   where B.Name = B.Name and
         B.Value = A.Value
   order by B.id asc) as 'B.id'
from cteA as A
order by 1, 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...