2012-03-29 8 views
1

У меня есть две таблицы аудита: Trip_aud и Event_aud. Они были созданы в Envers, но я обращаюсь к ним с SQL. Они в основном такие же, как и таблицы домена, за исключением значения ревизии, которое увеличивается каждый раз, когда происходит изменение, и некоторые кортежи вставляются в таблицу аудита.выберите максимальное значение во внутреннем запросе <другое во внешнем запросе

Когда Trip изменяется с определенного статуса (PLANNING ->EXECUTING), я сохраняю его текущую версию, поэтому после этого я могу сравнить то, что было выполнено (скажем, уходящее время) с запланированным. Эти события (оставление, остановка, ожидание ...) сохраняются в Event с указателем на Trip. События также проверяются.

Envers работает как система CVS: если я запрашиваю какой-либо элемент при данной ревизии, он ищет кортеж, который имеет максимальную ревизию, меньшую, чем данная ревизия. Пересмотр, который мне интересен, - это тот, который находится в Trip, который хранится при изменении состояния. Как выбрать все события из поездки в данной версии?

Вот как выглядят таблицы. org_rev - это ревизия поездки, в которой изменяется статус.

Trip_aud 
id | rev | status | org_rev | other columns... 
----|-----|----------|---------|--------------- 
1 | 1 |CREATED | NULL | 
1 | 2 |OPTIMIZING| NULL | 
1 | 3 |PLANNED | NULL | 
1 | ... | ... | NULL | 
1 | 44 |EXECUTING | 44 | 
1 | 58 |FINISHED | 44 | 

Event_aud 
id | trip_id | rev | start_time | other columns... 
----|---------|-----|------------|--------------- 
1 | 1 | 1 | 02:35:12 | 
2 | 1 | 1 | 03:14:84 | 
3 | 1 | 1 | 12:31:02 | 
1 | 1 | 2 | 04:00:00 | 
2 | 1 | 5 | 03:00:15 | 
2 | 1 | 10 | 05:49:59 | 
1 | 1 | 40 | 06:00:00 | 
1 | 1 | 58 | 06:07:39 | 

Если я хочу поездку и события на пересмотр 3, я получаю

Trip_aud 
id | rev | status | org_rev | other columns... 
----|-----|----------|---------|--------------- 
1 | 3 |PLANNED | NULL | ... 

Event_aud 
id | trip_id | rev | start_time | other columns... 
----|---------|-----|------------|--------------- 
1 | 1 | 2 | 04:00:00 | 
2 | 1 | 1 | 03:14:84 | 
3 | 1 | 1 | 12:31:02 | 

В ревизии 44, когда планирование было закончено, это

Trip_aud 
id | rev | status | org_rev | other columns... 
----|-----|----------|---------|--------------- 
1 | 44 |EXECUTING | 44 | 

Event_aud 
id | trip_id | rev | start_time | other columns... 
----|---------|-----|------------|--------------- 
1 | 1 | 40 | 06:00:00 | 
2 | 1 | 10 | 05:49:59 | 
3 | 1 | 1 | 12:31:02 | 

Я сделал следующее запрос для сравнения планирования и исполнения, но он ничего не возвращает! Он делает самостоятельное присоединение к EVENT_AUD, выдает дубликаты кортежей, которые отличаются только порядком их изменения и пытается выбрать максимум rev меньше, чем org_rev при поездке.

select t.id, planned.start_time, realized.start_time 
from 
    TRIP t 
    inner join EVENT realized on realized.trip_id = t.id 
    inner join EVENT_AUD planned on planned.id = realized.id 
where 
    planned.id in 
    (
     select ea1.id 
     from 
      EVENT_AUD ea1 
      inner join EVENT_AUD ea2 on ea1.id = ea2.id 
     where 
      ea1.rev > ea2.rev 
     group by ea1.id 
     having max(ea1.rev) < t.org_rev 
    ) 
    and t.id = {something given outside} 

Любопытно, что если я заменю t.org_rev с 44 лет, он работает! Что я делаю не так?

Спасибо за помощь!

META: Ожидается, что он предоставит небольшой пример базы данных в CSV, XML, INCLUDE INTO или что-то еще, чтобы люди могли протестировать SQL, о котором я прошу? Как я могу приложить к вопросу?

+0

Ответ META: да, это помогает, когда вы предоставляете SQL для создания своих данных. Вы можете отредактировать свой вопрос, или еще один хороший способ - вставить свой код в «gist» здесь: https://gist.github.com/, а затем поместить URL-адрес gist в вопрос. – joelparkerhenderson

ответ

1

Я думаю, что вам нужно также присоединить ea1 и ea2 к идентификатору поездки, потому что таким образом max дает максимальный оборот для всех событий. Это соединение также отсутствует между event и event_aud. Коррелированных подзапросов нуждается

where ea1.trip_id = t.id 

UPDATE:

Я не понимаю логику планируется в (выбрать ...), поэтому я изменил его не существует:

select t.id TripID, 
     planned.id pid, 
     planned.rev, 
     planned.start_time pst, 
     realized.start_time rst 
from 
    TRIP t 
    inner join EVENT realized 
     on realized.trip_id = t.id 
    inner join EVENT_AUD planned 
     on planned.id = realized.id 
      and realized.trip_id = planned.trip_id 
     -- Eliminate higher revisions 
      and planned.rev < t.org_rev 
where not exists (select null 
      from event_aud ea 
      where ea.trip_id = planned.trip_id 
       and ea.id = planned.id 
     -- Eliminate higher revisions 
       and ea.rev < t.org_rev 
     -- If there is higher revision than current not exists evaluates to false 
       and ea.rev > planned.rev) 
    and t.id = 1 
order by 1, 2 

Полный запрос на Sql Fiddle

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

  • Нет связанных вопросов^_^