【问题标题】:how to generate the xml from oracle如何从oracle生成xml
【发布时间】:2017-05-14 05:53:07
【问题描述】:

我有两张如下表

表学生

PersonID     firstName 
1            John
2            Mike

表格标记

mark_id     person_id   subject   marks
1           1           English    50
2           1           Maths      75

下面的查询给出如下的xml

select XMLElement(      "Students" ,
              (select XMLAgg( XMLElement("Student" ,                      
                             XmlElement( "Student_id","id")  ,
                             XmlElement(  "First_Name","firstname")  
                             ))
                             FROM students  )
                             )
                               AS "RESULT" 
From dual

<Students>
<Student>
<Student_id>1</Student_id>
<First_Name>John</First_Name>
</Student>
<Student>
<Student_id>2</Student_id>
<First_Name>Mike</First_Name>
</Student>
<Students>

现在我需要用Marks 左连接表students 并创建一个如下所示的 xml

<Students>
    <Student>
    <Student_id>1</Student_id>
    <First_Name>John</First_Name>
    <Marks>
     <subject>English</subject>
     <mark>50</mark>
     <subject>Maths</subject>
     <mark>75</mark>
    </Marks>
    </Student>
    <Student>
    <Student_id>2</Student_id>
    <First_Name>Mike</First_Name>
    <Marks/>
    </Student>
    <Students>

如果我编写选择查询,它将为第一个学生返回两行,因为它有 2 行要加入到第二个标记表中。

【问题讨论】:

  • 取决于要求是什么。如果有多个分数并且每个学生应该只有一行,则可以使用group by 子句。
  • @AluanHaddad 学生可以有多个科目和分数,有时没有分数。所以我使用左连接
  • Students as Student left join Marks as Mark on .... group by ...

标签: xml oracle


【解决方案1】:
select XMLElement(
         "Students" ,
         XMLAgg(
           XMLElement(
             "Student" ,
             XMLFOREST(
               s."Student_id" AS "id",
               s."First_Name" AS "firstname"
             ),
             m.marks
           )
         )
       )
FROM   students s
       LEFT OUTER JOIN
       ( SELECT person_id,
                XMLELEMENT(
                  "Marks",
                  XMLAGG(
                    XMLFOREST(
                      "subject",
                      "marks" AS "mark"
                    )
                  )
                ) AS marks
         FROM   Marks
       ) m
       ON ( s."PersonID" = m.person_id )

(注意:除非有特定的业务需求,否则为not good practice to use quoted identifiers for table/column names;只需在各处使用不带引号的标识符,并让 oracle 管理大小写(in)敏感性。)

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多