[英]How do I create single row publication records with multiple authors in SQL in order to generate XML?
一些上下文:我有一个带有发布记录的Oracle DB。 我正在尝试生成XML文件,其中包含由特定人员创作或编辑的所有出版物。 但是,XML也需要包含共同作者(以及其他信息,这不会造成任何麻烦)。
相关代码:
select NAME_FIRST_NAME,
NAME_LAST_NAME,
LIST_INDEX,
PUBLICATION_ID
from CLASSIFIED_AUTHOR_ASSOC CAA
join PUBLICATION PUB
on CAA.PUBLICATION_ID = PUB.ID
where CAA.PUBLICATION_ID IN
(select PUBLICATION_ID
from CLASSIFIED_AUTHOR_ASSOC
where PERSON_ID = '127746')
order by CAA.PUBLICATION_ID, CAA.LIST_INDEX ASC
样本输出:
鲍勃·约翰逊0 996822
鲍勃·约翰逊0 962544
鲍勃·约翰逊0 455211
苏·霍普金斯1 455211
list_index值很重要,因为它指示了相关的作者顺序。 问题是单个出版物有多个行。
我一直在研究枢轴函数,但是它们似乎都面向数值,这意味着您需要提前知道最终将获得多少行(我的数据集中的记录包含1至30位作者)。 我的问题是:如何最好地解决这个问题? 我是否将作者汇总在一个栏中? 在这种情况下,我不知道随后如何将它们放入不同的xml元素中。 还是有另一种方式可以实现我想做的事情?
任何朝着正确方向的指针将不胜感激!
查看SQL中的XMLELEMENT,XMLAGG和XMLATTRIBUTE函数以生成XML,XMLAGG将聚合/汇总重复行,因此它将父子代表示为元素/子元素。
您可以编写返回XMLTYPE的函数,然后在查询中引用这些函数,以使您的代码更易于理解。
就像是:
select XMLELEMENT( "List",
XMLAGG ( XMLELEMENT ( "Book",
XMLATTRIBUTES (NAME_FIRST_NAME,
NAME_LAST_NAME,
LIST_INDEX,
PUBLICATION_ID ) ) ) )
from CLASSIFIED_AUTHOR_ASSOC CAA
join PUBLICATION PUB
on CAA.PUBLICATION_ID = PUB.ID
where CAA.PUBLICATION_ID IN
(select PUBLICATION_ID
from CLASSIFIED_AUTHOR_ASSOC
where PERSON_ID = '127746')
order by CAA.PUBLICATION_ID, CAA.LIST_INDEX ASC
对此进行试验,以了解其工作原理以及如何使其达到您想要的目的。
如果要将LIST_INDEX转换为“作者一”,“作者二”等,请考虑使用“ TO_CHAR(TO_DATE(LIST_INDEX,'j'),'jsp')“将数字LIST_INDEX转换为文本字符串。
不愿创建一个更具体的示例的想法……我没有访问数据库的权限,但是我希望以上内容能为您提供一些有用的提示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.