2015-10-12 2 views
0

Устраняя вопрос, пожалуйста, помогите или укажите в правильном направлении.Sqlite вставить последнее значение из другой таблицы, сопоставляемой идентификатором

Я следующий пример таблицы:

HistoricalValue 
ID SITEID VAL DATE 
1 1  100 9/1 
2 1  120 10/1 
3 2  300 10/3 
4 2  350 10/10 

LOG 
ID SITEID VAL START_TIME END_TIME CALC 
1  1  120  10:10  10:20  (END_TIME-START_TIME)*VAL 

HistoricalValue таблица, где я ввожу данные для каждого сайта, и таблица LOG, где я хотел бы ввести некоторые параметры для расчета на.

Что я хочу - это автоматическое заполнение колонки «VAL (ue)» в таблице LOG с последним значением (по id? Или, возможно, по дате) из таблицы HistoricalValue на основе выбранного SiteID.

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

Заранее спасибо.

+0

Это интерактивная запись данных? –

ответ

-1

Вам нужно будет сделать триггер, чтобы сделать это автоматически. Если вы не имеете значение при вставке, то вы можете сделать:

insert into example(val1) 
    select val1 
    from example 
    order by id desc 
    limit 1; 

Это предполагает, что id является автоинкрементным столбец и используется для определения того, что был «последним» вставленное значение.

Триггер будет триггером before insert, который в основном выполняет тот же код.

+0

Спасибо Гордон. Пробовал ваше предложение, но он не вставляет «последнее» значение в val1, я все равно получаю значение «NULL», если я не ввожу ничего при вставке новой записи, но с этим триггером идентификатор увеличивается на 2 (если последняя запись 10, следующая запись - 12 и т. д.) – andy

+0

Это утверждение добавляет еще одну строку. И триггер BEFORE INSERT не сможет изменить что-либо, что вставлено. –

+0

@andy. , , Предполагается, что вы будете использовать это для вставки нового значения на основе предыдущего значения. Если у вас нет значения, используйте эту логику. –

0

Лучший способ - разрешить NULL для val и заполнить истинное значение на лету. Далее был выполнен в SQL Server, но не более чем манипуляция даты должна быть изменен:

with 
HistoricalValue(ID, SiteID, Val, ValDate)as(
    select 1, 1, 100, '2015-09-01' union all 
    select 2, 1, 120, '2015-10-01' union all 
    select 3, 2, 300, '2015-10-03' union all 
    select 4, 2, 350, '2015-10-10' 
), 
LogVal(ID, SiteID, Val, StartTime, EndTime)as(
    select 1, 1, 100, '2015-09-01 10:10', '2015-09-01 10:20' union all 
    select 1, 1, NULL, '2015-10-01 10:10', '2015-10-01 10:20' 
) 
select l.ID, l.SiteID, l.VAL LogVal, h.ValDate, h.val HistVal, 
     coalesce(l.VAL, h.val) as NewVal, 
     StartTime, EndTime, 
     DateDiff(SECOND, EndTime, StartTime) * coalesce(l.Val, h.Val) as CalcVal 
from LogVal l 
left join HistoricalValue h 
    on h.SiteID = l.SiteID 
    and h.ValDate =(
     select Max(ValDate) 
     from HistoricalValue 
     where SiteID = l.SiteID 
      and ValDate < l.StartTime 
      and Val is not null); 

Я поставила вторую запись журнала с не значения валь, чтобы показать, как последнее значение перед этой записью могут быть извлечены и использованы. Я также предполагаю, что время начала и начала на самом деле соответствует & значениям времени, иначе вы не можете указать, какие исторические записи перед записью журнала.

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