SQL XML嵌套查询

时间:2012-02-08 00:12:38

标签: sql xml nested

如何基于此类查询生成如下的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 个答案:

答案 0 :(得分:1)

执行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')