Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
linker_2004 Member Откуда: Сообщений: 16 |
Здравствуйте! Есть две таблицы: 1. id a1,a2,a3,a4,f 2. id b1,b2,b3,f они связаны по id- идентификатор первой таблицы. f- поле типа int для определения актуальности записи При каких либо изменениях запись инсертом копируется в таблицу с новым id и изменениями, а старая запись отправляется в архив с f=0 Возникла необходимость поменять значения в нескольких записях(здесь проблем нет), а вот как "отправить архив" из записи. Как думал я: 1. копировать записи с первой таблицы в неё же по условию с f=2. Тут создаются новые id идентификатором-сделал 2. делать в них изменения-сделал а тут подзавис, помогите чем можЫте) 3. затем копировать связанные записи из таблицы 2 в неё же с новым ID из таблицы 1 4. "отправить в архив" записи в обеих таблицах(f=0) и в созданных поменять f=1 USE base DECLARE @STR NVARCHAR(MAX) SET @STR ='111' --СОЗДАЮ НОВЫЕ ЗАПИСИ В ТАБЛИЦЕ 1 /*INSERT INTO Table1 (a1,a2,a2,a3,a4,f) SELECT a1,a2,a2,a3,a4,'2' FROM Book WHERE a1 LIKE '%'+@STR+'%'*/ |
2 авг 18, 09:32 [21623326] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
linker_2004, немного офф, видел много реализация SCD, но Ваша не самая удачная. Отслеживание версионности не должно влиять на первичный ключ и связи между таблицами. Если хочется пилить свое, то посмотрите несколько паттернов здесь или воспользуйтесь более новым, может это больше понравится |
2 авг 18, 12:20 [21624205] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2395 |
linker_2004, архив - в отдельную таблицу |
2 авг 18, 13:37 [21624580] Ответить | Цитировать Сообщить модератору |
linker_2004 Member Откуда: Сообщений: 16 |
Спасибо. Почитаю. Забыл написать что в каждой таблице есть поля с датой начала и конца актуальности типа datetime |
||
2 авг 18, 15:11 [21625032] Ответить | Цитировать Сообщить модератору |
Glebanski Member Откуда: Msk ->NL Сообщений: 319 |
linker_2004, Недопонял, зачем новый id генерится. Вроде бы f - это как-бы номер версии записи, так? Сделайте первичный ключ (id, f) и еще доп-поле isLastVersion, которое м.б 1 или 0 Это наверняка есть в тех ссылках от iiyama |
2 авг 18, 19:28 [21626086] Ответить | Цитировать Сообщить модератору |
Glebanski Member Откуда: Msk ->NL Сообщений: 319 |
Если конец IS NULL вот вам и отличный признак последней версии. А все остальное - "орхив" |
||
2 авг 18, 19:31 [21626095] Ответить | Цитировать Сообщить модератору |
linker_2004 Member Откуда: Сообщений: 16 |
f изначально и был только 0 и 1... немного коряво наверно и не так быстро, но зато работает.. кодить начал месяц назад.. За конструктивную критику отдельное спасибо. USE Base DECLARE @STR NVARCHAR(MAX) SET @STR ='КРУГ' DECLARE @STR1 NVARCHAR(MAX) SET @STR1 = 'КРУГ ТЕСТ' DECLARE @user NVARCHAR(15) SET @user='ТЕСТ' DECLARE @curD DATETIME SET @curD='01.08.2018 15:05:29' DECLARE @I BIGINT SET @I=1 WHILE @I!=0 BEGIN SELECT @I= (SELECT MIN(ID_NKN)FROM Book WHERE (IM LIKE '%'+@STR+'%')AND(FLAG_A='1')) INSERT INTO Table1 (a1,a2,a3,a4, ID_U,D_U,FLAG_A) SELECT a1,a2,a3,a4,@user,@curD,'2' FROM Table1 WHERE (ID=@I) AND (FLAG_A='1') INSERT INTO Table2(b1, b2, b3) SELECT b1, b2, b3, @user, @curD,'2',@@IDENTITY FROM Table2 WHERE ID=@I UPDATE Table1 SET FLAG_A=0, D_E=@curD, ID_U=@user WHERE ID=@I UPDATE Table2 SET FLAG_A=0, D_E=@curD, ID_U=@user WHERE ID_NKN=@I END; UPDATE Table1 SET a1 = (SELECT REPLACE(a1, @STR, @STR1)) WHERE (a1 LIKE '%'+@STR+'%') AND (FLAG_A='2') UPDATE Table1 SET FLAG_A = 1 WHERE FLAG_A=2 SELECT B.ID, B.a1,B.a2,,J.b1,J.b2,J.b3 FROM Table1 AS B LEFT JOIN Table2 AS J ON B.ID=J.ID WHERE (B.FLAG_A='1') AND (IM LIKE '%'+@STR+'%') ORDER BY B.ID Сообщение было отредактировано: 2 авг 18, 20:27 |
||
2 авг 18, 20:24 [21626220] Ответить | Цитировать Сообщить модератору |
linker_2004 Member Откуда: Сообщений: 16 |
хотел без циклов с циклами наверное не комильфо) но такого рода замены будут не частыми, так что думаю пойдет |
2 авг 18, 20:26 [21626226] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
linker_2004, У меня вопрос, это для учебных целей или производственная задача? |
3 авг 18, 10:41 [21627398] Ответить | Цитировать Сообщить модератору |
linker_2004 Member Откуда: Сообщений: 16 |
iiyama,производственная. Учусь на ходу подсказывать не по содержанию базы кроме интернета толком некому. Пишу программу под существующую базу поля или таблицы добавить могу |
3 авг 18, 14:06 [21628381] Ответить | Цитировать Сообщить модератору |
linker_2004 Member Откуда: Сообщений: 16 |
но как и везде есть голос свыше и ему виднее как должно быть) и не волнуют сущности и прочая "ерунда") но компромиссы бывают |
3 авг 18, 14:08 [21628391] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
linker_2004, В реальной жизни так делать нельзя, хотя бы потому что одновременно могут работать несколько человек. Не надо придумывать свои грабли, для этих целей уже реализованы не то что грабли, а комбайны К сообщению приложен файл. Размер - 40Kb |
3 авг 18, 14:23 [21628438] Ответить | Цитировать Сообщить модератору |
linker_2004 Member Откуда: Сообщений: 16 |
iiyama, спасибо. Создал отдел отдельную таблицу в неё пихаю историю. Так действительно намного проще и быстрее |
4 авг 18, 21:59 [21630066] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |