如何更正 PL/pgSQL 中缺少引用的“一对多 table”?
How to correct ‘One to Many table’ with missing references in PL/pgSQL?
我有一个大型数据文件,在每个相关子集的第一条记录上都有一个唯一的 11 位参考,但在属于相同子集的后续记录上却没有,而是具有伪造的 1 位或 2 位参考。 table 是按照它最初创建的顺序排列的,所以子集仍然正确地组合在一起,包含这些引用的字段称为“旧引用”。我刚刚创建了一个名为“New Ref”的新字段,我想在其中填充每个子集的所有适当的 11 位参考。如何在我可以 运行 on 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
您可以使用此 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
));
见demo
这个:
select max(id) from test where id <= t.id and length(oldref) = 11
获取包含第 11 位数字的行的 id
oldref
我有一个大型数据文件,在每个相关子集的第一条记录上都有一个唯一的 11 位参考,但在属于相同子集的后续记录上却没有,而是具有伪造的 1 位或 2 位参考。 table 是按照它最初创建的顺序排列的,所以子集仍然正确地组合在一起,包含这些引用的字段称为“旧引用”。我刚刚创建了一个名为“New Ref”的新字段,我想在其中填充每个子集的所有适当的 11 位参考。如何在我可以 运行 on 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
您可以使用此 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
));
见demo
这个:
select max(id) from test where id <= t.id and length(oldref) = 11
获取包含第 11 位数字的行的 id
oldref