2015-12-04 1 views
0

В некотором контексте: у меня есть БД Oracle с публикациями. Я пытаюсь создать файлы XML, содержащие все публикации, созданные или отредактированные определенным человеком. Однако XML также должен содержать соавторов (и множество другой информации, которая не вызывает никаких проблем).Как создать записи публикации одной строки с несколькими авторами в SQL для создания 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-элементах впоследствии. Или есть другой способ добиться того, что я хочу сделать?

Любые указатели в правильном направлении были бы очень признательны!

+0

Я нашел следующее частично решает мою проблему: 'select мин (случай, когда LIST_INDEX 0, то NAME_FIRST_NAME конец) AS "первый автор первого имени", мин (случай, когда LIST_INDEX 0, то NAME_LAST_NAME конец) AS «First авторская фамилия ", мин (случай LIST_INDEX, когда 1 затем NAME_FIRST_NAME конец) AS" Второе имя автора ", min (регистр LIST_INDEX, когда 1 затем NAME_LAST_NAME заканчивается) AS" Второе имя автора "и т. д. Не идеальный , так как мне приходится жестко кодировать 60 строк для размещения 30 возможных авторов, и в этом случае большинство столбцов будут «null». –

ответ

1

Посмотрите на функции XMLELEMENT, XMLAGG и XMLATTRIBUTE в SQL для генерации 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 на что-то вроде «Author One», «Author Two» и т. Д., Подумайте об использовании «TO_CHAR (TO_DATE (LIST_INDEX,« j »),« jsp »), чтобы преобразовать число LIST_INDEX в текстовая строка.

Сори, не создавая более конкретного примера ... У меня нет доступа к моей базе данных для тестирования, но я надеюсь, что приведенное выше дает вам полезные подсказки.

+0

Спасибо! Я изучал XML-функции Oracle, но был немного запуган (так как я должен делать довольно много условных вещей) и надеялся сделать преобразование в Python. Возможно, я должен использовать эту возможность, чтобы ознакомиться со встроенными функциями XML. –

Смежные вопросы