2013-09-20 3 views
1

У меня есть следующие таблицы:Обновление next_id колонки

VehicleID Reg_ID Next_RegID EntryDate 
330034 9111 NULL  2010-12-06 00:00:00 
330034 9113 NULL  2010-12-09 00:00:00 

На первой строке мне нужно обновить столбец Next_RegId с Reg_ID второго ряда, где VehicleId или (VIN/ChassisNumber) одно и то же. Столбец Next_RegID в последней записи должен оставаться Null.

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

Вот процедура я написал, и заранее спасибо за вашу помощь:

Declare @i as integer; 
Declare @x as integer; 
Declare @y as integer 

Set @i= (Select Max(RID) from TempRegistration) 
Set @x= 0 
Set @y= 1 
Declare @curChassis as nvarchar(100) 
Declare @nextChassis as nvarchar(100) 

    While (@x <= @i) 
    Begin 
set @curChassis = (Select ChassisNumber from TempRegistration where RID = @x) 
set @nextChassis = (Select ChassisNumber from TempRegistration where RID = @y) 

If (@curChassis = @nextChassis) 
Begin 
    Update Registration set NextRegistrationId = (Select RegistrationId from  TempRegistration where RID = @y) 
    Where RegistrationId = (Select RegistrationId from TempRegistration where RID = @x) 
End 

Set @x = @x + 1 
Set @y = @y + 1 

Print(@x) 
    End 

TempRegistration это временная таблица, я создал для назначения ROW_ID, который направляет время цикла, чтобы назначить Reg_ID к Next_RegId в предыдущей строке.

+5

*** SQL *** - это только * Структурированный язык запросов * - язык, используемый многими системами баз данных, но не продукт базы данных ... многие вещи специфичны для поставщиков, поэтому нам действительно нужно знать, что ** система баз данных ** (и какая версия) вы используете (пожалуйста, обновите теги соответственно) .... –

ответ

0

Это может быть сделано с помощью одного запроса UPDATE. Вы не упомянули РСУБД так ...

Для MSSQL:

Update Registration as t1 
set NextRegistrationId = (Select TOP 1 RegistrationId 
             from Registration 
             where RID = t1.RID 
             and EntryDate>t1.EntryDate 
             order by EntryDate DESC) 

Для MySQL

Update Registration as t1 
set NextRegistrationId = (Select RegistrationId 
             from Registration 
             where RID = t1.RID 
              and EntryDate>t1.EntryDate 
             order by EntryDate DESC 
             LIMIT 1) 

Если РИД увеличиваются с EntryDate затем

Update Registration as t1 
set NextRegistrationId = (Select MIN(RegistrationId) 
             from Registration 
             where RID = t1.RID 
             and EntryDate>t1.EntryDate 
         ) 
+0

Спасибо, что направили меня в правильном направлении. Единственное, что мне пришлось изменить: «Где VehicleID = t1.VehicleId и RID t2.EntryDate. В очередной раз благодарим за помощь :) – user1961008

0

Испытано и он работает, но в этой версии используется CTE (SQL Server)

with RegDetails as 
(
select VehicleID, Reg_ID, ROW_NUMBER() OVER(PARTITION BY VehicleID ORDER BY EntryDate) AS ROWNUMBER 
FROM dbo.Vehicle) 
UPDATE a SET a.Next_RegID = b.Reg_ID 
FROM RegDetails b 
INNER JOIN dbo.Vehicle a ON (a.VehicleID = b.VehicleID) 
WHERE b.ROWNUMBER = 2 and a.Next_RegID IS NULL and a.Reg_ID != b.Reg_ID 
Смежные вопросы