обновить поле oldID на основе полей в той же таблице - PullRequest
0 голосов
/ 25 января 2012

Мне нужна помощь по следующему запросу.

create table #table1
(id int not null primary key identity,
customer_name varchar(25),
usage float,
oldID int null
)


insert into #table1 values('ABC',46.5,null)
insert into #table1 values('ABC',46.5,null)
insert into #table1 values('DEF',36.8,null)
insert into #table1 values('XYZ',50.1,null)
insert into #table1 values('DEF',36.8,null)
insert into #table1 values('XYZ',50.1,null)

select * from #table1

Я хочу, чтобы моя таблица обновлялась следующим образом

id          customer_name             usage                  oldID
----------- ------------------------- ---------------------- -----------
1           ABC                       46.5                   NULL
2           ABC                       46.5                   1
3           DEF                       36.8                   NULL
4           XYZ                       50.1                   NULL
5           DEF                       36.8                   3
6           XYZ                       50.1                   4
  1. Две записи с одинаковым именем и использованиемозначает, что более поздняя запись была обновлена.
  2. В новой записи поле oldID должно указывать на его старую запись (ID).

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

Ответы [ 2 ]

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

Попробуйте это, используя CTE:

;WITH data AS
(
    SELECT 
        id, customer_name,
        OldID = (SELECT MIN(id) FROM #table1 t2 WHERE t2.customer_name = t.customer_name)
    FROM #table1 t
)
UPDATE #table1
SET OldID = data.OldID
FROM Data
WHERE 
    data.customer_Name = #table1.customer_name
    AND #table1.ID <> data.oldid

select * from #table1

CTE Data в основном просто определяет минимальный ID для каждого клиента, и если ID этого клиента не является этим минимальным идентификатором, тоOldID установлено в это значение ID.

Когда я запускаю это, я получаю результирующий вывод:

id  customer_name   usage   oldID
 1   ABC            46.5    NULL
 2   ABC            46.5    1
 3   DEF            36.8    NULL
 4   XYZ            50.1    NULL
 5   DEF            36.8    3
 6   XYZ            50.1    4
0 голосов
/ 25 января 2012

С cte, без подзапросов, обновление только клиентов с несколькими строками:

with cte as (
   select customer_name, min( id ) as id
   from #table1
   group by customer_name
   having count(*) > 1
)
update #table1 
 set oldID = cte.id
 from cte 
 where #table1.customer_name = cte.customer_name
 and #table1.id != cte.id 
...