XML - Oracle - синтаксис для объединения сведений о сотруднике в одну выходную запись XML - PullRequest
1 голос
/ 06 марта 2019

Используя Oracle SQL Developer, мне нужно получить одну выходную запись xml для каждого сотрудника, имеющего несколько записей о потерях в часах.

Если у сотрудника 1111 есть 3 записи об использованных часах, я хочу, чтобы все экземпляры отображались как:

<Employee>
<UniqueIdentifier>
    <NationalIdNumber>1111</NationalIdNumber>
</UniqueIdentifier>
<UsedHoursLost>
    <Date>2/01/2018</>
    <HoursLost>4</HoursLost>
    <Status>A</Status>
    <HourType>PTO'</HourType>
</UsedHoursLost>
<UsedHoursLost>
    <Date>7/01/2018</>
    <HoursLost>2</HoursLost>
    <Status>A</Status>
    <HourType>PTO'</HourType>
</UsedHoursLost>
<UsedHoursLost>
    <Date>8/01/2018</>
    <HoursLost>7</HoursLost>
    <Status>A</Status>
    <HourType>PTO'</HourType>
</UsedHoursLost>

Вместо этого я вижу 3 отдельные записи результатов XML:

<Employee>
<UniqueIdentifier>
    <NationalIdNumber>1111</NationalIdNumber>
</UniqueIdentifier>
<UsedHoursLost>
    <Date>2/01/2018</>
    <HoursLost>4</HoursLost>
    <Status>A</Status>
    <HourType>PTO'</HourType>
</UsedHoursLost>
</Employee> 

<Employee>
<UniqueIdentifier>
    <NationalIdNumber>1111</NationalIdNumber>
</UniqueIdentifier>
<UsedHoursLost>
    <Date>7/01/2018</>
    <HoursLost>2</HoursLost>
    <Status>A</Status>
    <HourType>PTO'</HourType>
</UsedHoursLost>
</Employee> 

<Employee>
<UniqueIdentifier>
    <NationalIdNumber>1111</NationalIdNumber>
</UniqueIdentifier>
<UsedHoursLost>
    <Date>8/01/2018</>
    <HoursLost>7</HoursLost>
    <Status>A</Status>
    <HourType>PTO'</HourType>
  </UsedHoursLost>
</Employee> 

Запрос, который я использую для первого примера XML, выглядит примерно так:

SELECT 
XMLELEMENT("Employee",
XMLFOREST(
       A.EMPLOYEE "NationalIdNumber"
       ) AS UniqueIdentifier
XMLELEMENT("UsedHoursLost",
XMLFOREST(
         B.OCCURRENCE_DATE "Date",
         B.HOURS "HoursLost",
         B.STATUS "Status",
         'PTO' "HourType")) AS HoursLost
         )RESULTS
FROM TABLE1 A
 JOIN TABLE2 B
 on a.employee = b.employee
WHERE a.COMPANY_ID = 1234      

Как должен выглядеть запрос, чтобы получить второй результат вывода?

1 Ответ

0 голосов
/ 06 марта 2019

Функция XMLAGG может агрегировать строки.Функция XMLCONCAT может объединять элементы, не создавая один из них как дочерний элемент другого.

SELECT
    XMLELEMENT
    (
        "Employee",
        XMLCONCAT
        (
            XMLELEMENT
            (
                "UniqueIdentifier",
                XMLELEMENT("NationalIdNumber", a.employee)
            ),
            XMLAGG
            (
                XMLELEMENT
                (
                    "UsedHoursLost",
                    XMLFOREST
                    (
                        B.OCCURRENCE_DATE "Date",
                        B.HOURS "HoursLost",
                        B.STATUS "Status",
                        'PTO' "HourType"
                    ) results
                )
                ORDER BY B.OCCURRENCE_DATE
            )
        )
    )
FROM TABLE1 A
 JOIN TABLE2 B
 on a.employee = b.employee
WHERE a.COMPANY_ID = 1234
GROUP BY A.EMPLOYEE;

Я использовал эту схему теста:

create table table1 as
select 1111 employee, 1234 company_id from dual;

create table table2 as
select 1111 employee, date '2018-02-01' occurrence_date, 4 hours, 'A' status from dual union all
select 1111 employee, date '2018-07-01' occurrence_date, 2 hours, 'A' status from dual union all
select 1111 employee, date '2018-08-01' occurrence_date, 7 hours, 'A' status from dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...