SQL XML вложенный запрос - PullRequest
       9

SQL XML вложенный запрос

0 голосов
/ 08 февраля 2012

Как сгенерировать ниже как XML на основе такого запроса?

SELECT
    t1.Code,    
    (SELECT
        CASE 
            WHEN t1.Type = 5 THEN
                (SELECT top 1
                    t2.CodeName
                FROM dbo.Table2 t2
                WHERE t2.Id = t4.Id
          FOR XML  PATH('Code'), TYPE)          
      ELSE  
          (SELECT 
             t3.CodeName
          FROM dbo.Table3 t3
                WHERE t3.Id = t4.Id
                FOR XML PATH('Code'), TYPE)                     
      END
    FROM dbo.Table4 t4
    WHERE t4.Id = t1.Id
    FOR XML PATH('CodeNames'), TYPE)    
FROM dbo.Table1  t1 WITH (NOLOCK)
FOR XML RAW ('Table1Child'), TYPE, ROOT('Table1Root')

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

<Table1Root>
  <Table1Child Code="ABC">
    <CodeNames>
      <Code Name="A1" />
      <Code Name="B2" />
      <Code Name="C3" />
    </CodeNames>
  </Table1Child>
  <Table1Child Code="DEF">
    <CodeNames>
      <Code Name="D4" />
      <Code Name="E5" />
      <Code Name="F6" />
    </CodeNames>
  </Table1Child>
</Table1Root>

1 Ответ

1 голос
/ 08 февраля 2012

Сделайте UNION вместо CASE и используйте @ для создания атрибута.

SELECT
    t1.Code,    
    (SELECT
      (SELECT CodeName as '@Name'
       FROM (
             SELECT t2.CodeName
             FROM Table2 t2
             WHERE t2.Id = t4.Id AND
                   t1.Type = 5
             UNION ALL
             SELECT t3.CodeName
             FROM Table3 t3
             WHERE t3.Id = t4.Id AND
                   t1.Type <> 5
            ) AS T 
       FOR XML PATH('Code'), TYPE)          
     FROM Table4 t4
     WHERE t4.Id = t1.Id
     FOR XML PATH('CodeNames'), TYPE)    
FROM Table1 t1
FOR XML RAW ('Table1Child'), TYPE, ROOT('Table1Root')

Похоже, вам на самом деле не нужно использовать Table4.

SELECT
    t1.Code,    
      (SELECT CodeName as '@Name'
       FROM (
             SELECT t2.CodeName
             FROM Table2 t2
             WHERE t2.Id = t1.Id AND
                   t1.Type = 5
             UNION ALL
             SELECT t3.CodeName
             FROM Table3 t3
             WHERE t3.Id = t1.Id AND
                   t1.Type <> 5
            ) AS T 
       FOR XML PATH('Code'), ROOT('CodeNames'), TYPE)          
FROM Table1 t1
FOR XML RAW ('Table1Child'), TYPE, ROOT('Table1Root')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...