Сохранение всех версий строки, помечая только одну как текущую - PullRequest
0 голосов
/ 28 января 2012

Я новичок в SQL и пытаюсь чего-то достичь.

У меня есть таблица с полями вроде:

<b>CustId   Fname   Lname    Address1    Address2  Zip    State  LoadDate   Flag</b>
1        John     Leo      xxx        xxx       34532    VA    1/1/2012   Y
2        Mike     Saunder  xxx        xxx       94090    CA    1/1/2012   Y

Каждый раз, когда я вставляю новую запись, она устанавливает свой флаг на Y, но, скажем, если какое-либо из значений записи изменится, то новая будет установлена ​​на Флаг Y, а старая на N. Так, например, если Mikes address1 изменился.

<b>CustId   Fname   Lname    Address1    Address2  Zip    State  LoadDate   Flag</b>
1        John     Leo      xxx        xxx       34532    VA    1/1/2012   Y
2        Mike     Saunder  xxx        xxx       94090    CA    1/1/2012   N
3        Mike     Saunder  rrr        xxx       94090    CA    2/1/2012   Y

Ответы [ 2 ]

1 голос
/ 28 января 2012

Предполагая, что вы пытаетесь сказать, что пара Fname / Lname является уникальным ключом, который позволяет вам сопоставлять строки:

declare @Folks as table ( CustId int, Fname varchar(10), Lname varchar(10),
  Address1 varchar(10), Address2 varchar(10),
  Zip varchar(9), State varchar(2), LoadDate date, Flag char(1) )
insert into @Folks ( CustId, Fname, Lname, Address1, Address2, Zip, State, LoadDate, Flag ) values
  ( 1, 'John', 'Leo', 'xxx', 'xxx', '34532', 'VA', '1/1/2012', '-' ),
  ( 2, 'Mike', 'Saunder', 'xxx', 'xxx', '94090', 'CA', '1/1/2012', '-' ),
  ( 3, 'Mike', 'Saunder', 'rrr', 'xxx', '94090', 'CA', '2/1/2012', '-' )

-- Before setting the Flag.
select * from @Folks

-- Computing a flying flag rather than using a stored value.
select *, case when LoadDate = ( select MAX(LoadDate) from @Folks as S where S.Fname = O.Fname and S.Lname = O.Lname ) then 'Y' else 'N' end as 'FlyingFlag'
  from @Folks as O

-- Updating all stored values.  Every bloody row.
update @Folks
  set Flag = case when LoadDate = ( select MAX(LoadDate) from @Folks as S where S.Fname = O.Fname and S.Lname = O.Lname ) then 'Y' else 'N' end
  from @Folks as O

-- Showing the result.
select * from @Folks

РЕДАКТИРОВАТЬ: Я все еще думаю, что это не то направление, которым вы хотите бытьзаголовок.Например, он не может корректно размещать более одного обновления для каждого клиента в день, если только вы не полагаетесь на то, что CustId является средством разрыва связей.

Немного лучшим решением было бы заменить флаг на поле PreviousId, котороеNULL в первой строке для клиента, а в последующих - содержит CustId заменяемой строки.Это связывает воедино изменения для каждого клиента и обеспечивает четко определенный заказ в случае, если клиент обновляется неоднократно в одну дату.

0 голосов
/ 28 января 2012

Я предполагаю, что custid - это столбец идентификаторов, который автоматически увеличивается.

update table set flag="N" where CustId= (insert Mike's current CustId here);

затем

insert into table(Fname, Lname, Address1, Address2, Zip, State, LoadDate, Flag)
values(Mike, Saunder, rrr, xxx, 94090, CA, 2/1/2012, Y);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...