2013-04-10 2 views
0

Я таблица с именем SALARIES_LOG из XMLTYPE с данными, как это в каждой строке:Oracle XQuery - Выбор последней записи, которая удовлетворяет условию

<pay_rise event_id="511"><employee_id>1</employee_id> ... </pay_rise> 
<pay_rise event_id="512"><employee_id>2</employee_id> ... </pay_rise> 
<pay_rise event_id="513"><employee_id>1</employee_id> ... </pay_rise> 
<pay_rise event_id="514"><employee_id>3</employee_id> ... </pay_rise> 
<pay_rise event_id="515"><employee_id>1</employee_id> ... </pay_rise> 
<pay_rise event_id="516"><employee_id>2</employee_id> ... </pay_rise> 

Для каждого employee_id значения, если есть более чем одна запись для этого значения, Мне нужно получить последний номер. В примерных данных было бы:

<pay_rise event_id="515"><employee_id>1</employee_id></pay_rise> 
<pay_rise event_id="516"><employee_id>2</employee_id></pay_rise> 

Обратите внимание, что я не нужна запись для employee_id = 3, потому что есть только одна такая запись.

Можно ли получить такой результат при использовании XQuery? Я довольно близко, но все еще застряли:

SELECT XMLQuery(
'for $d in ora:view("SALARIES_LOG")/pay_rise, 
    $e in ora:view("SALARIES_LOG")/pay_rise 

    where $d/employee_id = $e/employee_id and $d/@event_id < $e/@event_id 

    return 
    <pay_rise>{$e/@event_id} 
     <employee_id>{$d/employee_id/text()}</employee_id>   
    </pay_rise>' 
RETURNING CONTENT) FROM dual; 

, который дает мне:

<pay_rise event_id="513"><employee_id>1</employee_id></pay_rise> -> unwanted entry 
<pay_rise event_id="515"><employee_id>1</employee_id></pay_rise> 
<pay_rise event_id="516"><employee_id>2</employee_id></pay_rise> 
<pay_rise event_id="515"><employee_id>1</employee_id></pay_rise> -> unwanted & duplicated entry 

ответ

0

Ваш запрос сравнивает каждую пару pay_rise элементов по отдельности, что не то, что вы хотите. Попробуйте это вместо:

SELECT XMLQuery(
' for $id in distinct-values(ora:view("SALARIES_LOG")/pay_rise/employee_id) 
    let $pay_rises := ora:view("SALARIES_LOG")/pay_rise[employee_id = $id] 
    where count($pay_rises) > 1 
    return $pay_rises[last()]' 
RETURNING CONTENT) FROM dual; 
+0

Спасибо, теперь это решило. :) – user1969391

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