繁体   English   中英

如何在SQL中创建具有多个作者的单行发布记录以生成XML?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM