2015-05-18 3 views
0

У меня есть данные ниже адресов в таблице оракула для человека [Отображение для конкретного человека и другой пары полей не показано].как отрегулировать данные других строк на основе удаляемой строки

**StartDate     Address    EndDate** <br/> 

1. 10-JAN-2015 10:52:23 1 Гримшо 12-JAN-2015 11:30:15
2. 12-JAN-2015 11:30:15 2 Ashwood 15-JAN -2015 03:17:05
3. 15-JAN-2015 03:17:05 5 Green Drive 13-FEB-2015 06:03:55
4. 13-FEB-2015 06:03:55 6 Лайтфут Закрыть 18 февраля 2015 17:37:01
5. 18-февраля-2015 17:37:01 7 Лайтфут Ln 15-МАР-2015 01:19:31

Все эти адреса имеют правильная последовательность дат. Это означает, что конкретный человек всегда имеет действительный адрес между 10-JAN-2015 и 15-MAR-2015 здесь]. Требование состоит в том, чтобы, например, удалить один из адресов и соответствующим образом скорректировать дату, чтобы не осталось пробелов. У нас есть скрипт, который удаляет определенные строки, но не может обновить даты в других строках. Например, если удалить 3-й строки в приведенном выше наборе, то конечный результат должен выглядеть

**StartDate     Address    EndDate** <br/> 

1. 10-JAN-2015 10:52:23 1 Гримшоу 12-JAN-2015 11:30 : 15
2. 12-JAN-2015 11:30:15 2 Ashwood 13-февраля-2015 6:03:55
3. 13-февраля-2015 6:03:55 6 Лайтфут Закрыть 18 -FEB-2015 17:37:01
4. 18-FEB-2015 17:37:01 7 Lightfoot Ln 15-MAR-2015 01:19:31

EndDate второй строки обновляется с помощью EndDate удаленной строки [т. Е. Третьей строки].

Примечание: Номера записей 1-5 здесь приведены только для иллюстрации, а таблица не имеет таких столбцов.

+0

r u используя сервер sql или oracle? – Sachu

+0

Oracle ... и в основном ищет какой-то инновационный способ SQL или pl/sql в противном случае ... – Naeem

+0

всегда обновляет строку, имеющую конец с датой начала удаленной строки .. в ур пример дата начала удаленной строки - 15 и ур обновляя строку с датой окончания с 15 .. и ур, обновляя дату окончания с датой окончания удаленной строки. Это всегда так? – Sachu

ответ

0

Я написал этот триггер, предположив ниже условие

  1. В таблице будет person_id столбца для представления каждого человека
  2. Когда строка становится удалена обновление будет иметь место для строки, имеющие End date с start date из удаленной строки
  3. при удалении строки всегда значения EndDate столбца из удаленной строки будет использоваться для обновления EndDate столбца выше строк

    create or replace trigger product_update 
    
    BEFORE DELETE on your_table_name 
    for each row 
    

    начинает

    UPDATE your_table_name 
        SET EndDate = :new.EndDate, 
    WHERE EndDate = :new.StartDate 
    AND PERSON_ID = :new.PERSON_ID; 
    

    конца;

0

Я придумал термин Row Spanning зависимости для всего шаблона дизайна вы показываете. Именно здесь один столбец зависит от другого столбца, но в другой строке. Проблема в том, что сохранение целостности данных - это кошмар - как вы можете видеть.

Что я рекомендую - полностью опустить столбец EndDate. Если это то, что у вас нет власти, вы можете просто проигнорировать его. Поле EndDate не имеет никакой цели, кроме как сделать вашу жизнь несчастной.

Используя только поле StartDate, адрес начинается с этого времени и продолжается до следующего более высокого значения StartDate. Таким образом, если вы удаляете указанную строку, адрес, который начался 12 января, теперь продолжается до 13 февраля. Вы можете позже вставить новую строку с StartDate, скажем, 20 января, и она прекрасно вписывается в последовательность: 12 января -> 20 января -> 13 февраля ...

Важно, чтобы каждая строка не зависела от других строк. Вы можете вставлять, удалять и обновлять содержимое вашего сердца, и, пока значение даты остается уникальным, последовательность никогда не прерывается. Уникальность просто обеспечивается, когда StartDate является частью ПК.

Автоматически, без дополнительных усилий с вашей стороны, сохраняется непрерывная последовательность дат, без пробелов и невозможности включения. Этот момент нельзя переоценить: невозможно «разбить» последовательность. Даже если две даты отличаются только миллисекундами (что, вероятно, означает, что одно из значений даты неверно), последовательность остается неповрежденной. Если одна из дат неверна, обновите ее до правильного значения, не беспокоясь о нарушении целостности последовательности.

Запрос, чтобы увидеть, какой адрес был активен на определенную дату, на самом деле довольно проста:

select a.StartDate, a.Address 
from Addresses a 
where StartDate =(
     select Max(StartDate) 
     from Addresses 
     where PersonID = a.PersonID 
      and StartDate <= :AsOfDate); 

Вы можете воспроизвести форму/EndDate StartDate, если необходимо:

select a.StartDate, a.Address, a1.StartDate as EndDate 
from Addresses a 
left join Addesses a1 
    on a1.PersonID = a.PersonID 
    and a1.StartDate =(
     select Min(StartDate) 
     from Addresses 
     where PersonID = a.PersonID 
      and StartDate > a.StartDate); 

Последняя дата - тот, который представляет «текущий» адрес, будет показывать значение EndDate, равное NULL, что дает дополнительное преимущество для маркировки текущей строки.

Фактически вы можете создать представление, основанное на втором запросе, и дать своим пользователям то, что они привыкли видеть. Другое удобное представление будет основано на первом запросе, но с sysdate вместо параметра. Это будет показывать только текущие адреса. В любом случае, теперь вам не нужно хлопотать с сохранением значения StartDate одной строки, а значение EndDate для другой строки постоянно синхронизируется.

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