Как исправить таблицу «один ко многим» с отсутствующими ссылками в PL/pgSQL?

У меня есть большой файл данных с уникальной 11-значной ссылкой на первую запись каждого связанного подмножества, но не на последующие записи, принадлежащие тем же подмножествам, которые вместо этого содержат фиктивную 1- или 2-значную ссылку. Таблица находится в том порядке, в котором она была создана изначально, поэтому подмножества по-прежнему правильно сгруппированы, а поле, содержащее эти ссылки, называется «Старая ссылка». Я только что создал новое поле под названием «Новая ссылка», которое я хочу заполнить всеми соответствующими 11-значными ссылками для каждого подмножества. Как этого лучше всего добиться в сценарии, который я могу запустить на PL/pgSQL?

Вот пример данных как есть (текущие) и как я хотел бы, чтобы они обновлялись:

   Current datafile
__________________________________
ID  | Old Ref       | New Ref
==================================
1   | 14740807000   |
2   | 1             |    
3   | 2             |    
4   | 3             |
5   | 58            |
6   | 14735113000   | 
7   | 1             |               
8   | 2             |    
9   | 39            |   
10  | 4             |    
11  | 5             |    
12  | 14915146000   | 
13  | 9             |        
14  | 27            | 
15  | 14915146000   | 
16  | 3             | 
17  | 4             |    
==================================

Sought updated datafile
__________________________________
ID  | Old Ref       | New Ref
==================================
1   | 14740807000   | 14740807000
2   | 1             | 14740807000    
3   | 2             | 14740807000    
4   | 3             | 14740807000 
5   | 58            | 14740807000
6   | 14735113000   | 14735113000 
7   | 1             | 14735113000               
8   | 2             | 14735113000    
9   | 39            | 14735113000    
10  | 4             | 14735113000    
11  | 5             | 14735113000    
12  | 14915146000   | 14915146000
13  | 9             | 14915146000        
14  | 27            | 14915146000
15  | 14915175959   | 14915175959
16  | 3             | 14915175959
17  | 4             | 14915175959    
==================================

У меня был то, что я считал удобным способом сделать это в MS Access, но он не может справиться с размером файла данных, который мне нужно обновить, что является одной из причин, по которой я переключился на PostgreSQL.

Вот этот скрипт MS Access:

Sub UpdateRef()
On Error GoTo ErrorHandler

Dim strSQL, Var1 As String
Dim rs As New ADODB.Recordset

rs.Open "SELECT test.* FROM test", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

rs.MoveFirst
Var1 = rs![Old ref]
rs![New Ref] = Var1
rs.Update

Do Until rs.EOF
  'SysCmd acSysCmdUpdateMeter, n
  If len(rs![Old ref]) > 2 Then
    Var1 = rs![field2]
  End If
rs![New Ref] = Var1
rs.Update
rs.MoveNext
Loop
  rs.Close
ExitSub:
  Set rs = Nothing
  Exit Sub
ErrorHandler:
  Resume ExitSub
End Sub

Спасибо за предложение - теперь я включил это.

Rich28 10.02.2019 17:47

Какой тип данных у Old Ref?

forpas 10.02.2019 17:52

(Проголосовал за быстрый ответ на запрос о разъяснении - хорошая работа!)

halfer 10.02.2019 20:24
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это с помощью этого оператора update:

update test t
set newref = (select tt.oldref from test tt where tt.id = (
  select max(id) from test where id <= t.id and length(oldref) = 11
));

См. демо
Этот:

select max(id) from test where id <= t.id and length(oldref) = 11

получает id строки, содержащей 11-значный oldref

Другие вопросы по теме