У меня есть две таблицы аудита: 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, о котором я прошу? Как я могу приложить к вопросу?
Ответ META: да, это помогает, когда вы предоставляете SQL для создания своих данных. Вы можете отредактировать свой вопрос, или еще один хороший способ - вставить свой код в «gist» здесь: https://gist.github.com/, а затем поместить URL-адрес gist в вопрос. – joelparkerhenderson